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

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); //接收串口数据
  }

  //数据拼包、处理等
  .......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章