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); //接收串口数据
}
//数据拼包、处理等
.......
}
Linux系统和Android系统用户层C/C++开发 select()监听串口端口接收数据
猜你喜欢
转载自blog.csdn.net/weixin_40779546/article/details/81449852
今日推荐
周排行