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

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