Linux/Android系统开发 用select监听串口数据源码

本文介绍了一种使用select()函数监听串口端口接收数据的方法,这种方法可以提高程序效率并降低功耗。通过设置监听超时时间,可以有效避免端口卡死的问题,同时保证程序的稳定性和响应速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select详解见https://baike.baidu.com/item/select%28%29/10082180?fr=aladdin

select()监听串口端口接收数据,可提高程序效率,降低功耗,并可避免非阻塞模式下直接read()大量数据时造成的端口卡死问题。

#define PACKETSIZE 512

fd_set rfds;
int g_uart_fd;
struct timeval tv;
int ret_val;
int read_size;
char read_buf[PACKETSIZE] = {0};

while(1){
  FD_ZERO(&rfds); 
  FD_SET(g_uart_fd,&rfds); 
  tv.tv_sec = 0;                                     //设置监听串口端口超时时间为800毫秒,为0时相当于阻塞模式
  tv.tv_usec = 800000;                                  
  ret_val = selcet(g_uart_fd+1,&rfds,NULL,NULL,&tv); //监听的800毫秒期间阻塞在此,监听到数据或超时后顺序执行程序
  if(ret_val == -1){
    printf("select err");
    return ret_val ;                                 //根据需要return或者continue等
  }else if(ret_val == 0){                            //监听超时,未监测到串口有数据需要接收
    printf("select timeout");
    return ret_val ;                                 //根据需要return或者continue等
  }else{
    read_size = read(g_uart_fd,read_buf,PACKETSIZE); //接收串口数据
  }

  //数据拼包、处理等
  .......
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值