标签:com 检查 result lse 变化 定义 超出 根据 timeout
申明:本文转自链接:https://www.jianshu.com/p/a293869bbdb8
串口读函数read是阻塞函数,多路串口接收不太好处理,如果每路串口使用单独的线程接收浪费资源,使用select()函数监听多路串口数据可以把所有接收的数据在一个线程中处理,类似QT中的槽函数功能。
1、函数原型介绍:
int select(int nfds, fd_set *rdfds, fd_set *wtfds, fd_set *exfds, struct timeval *timeout)
int main(void)
{
int uart01_fd ,uart02_fd;
fd_set recv_fds; /* 定义接收fds 一个存放文件描述符(file descriptor),即文件句柄的聚合,实际上是一long类型的数组 */
int maxfd = 0; /* 定义最大句柄 */
int fd_result;
struct timeval tv; /* 超时时间 */
uart01_fd = open("/dev/ttyO1", O_RDWR | O_NOCTTY); /* 打开串口 */
if(uart01_fd < 0) {
printf("open /dev/ttyO1 error \r\n");
// return -1;
}
uart02_fd = open("/dev/ttyO2", O_RDWR | O_NOCTTY); /* 打开串口 */
if(uart02_fd < 0) {
printf("open /dev/ttyO2 error \r\n");
// return -1;
}
tv.tv_sec = 10; //设定超时时间
tv.tv_usec = 0; //10000us = 10ms
if(uart01_fd > maxfd) /* maxfd 为最大值 */
{
maxfd = uart01_fd;
}
if(uart02_fd > maxfd)
{
maxfd = uart01_fd;
}
for(;;)
{
/* 注意每次都要重新设置 */
FD_ZERO(&recv_fds);
FD_SET(uart01_fd,&recv_fds); /* 分别把句柄加入读监视集合里去 */
FD_SET(uart02_fd,&recv_fds); /* 分别把句柄加入读监视集合里去 */
fd_result = select(maxfd + 1, &recv_fds, NULL, NULL, &tv); /* 注意是最大值加1 */
if(fd_result < 0)
{
printf("select err"); /* select函数出错 */
usleep(10000);
continue;
}
else if(fd_result == 0)
{
// printf("select time out \n"); /* 在设定的tv时间内,socket的状态没有发生变化 */
usleep(10000);
continue;
}
else /* 开始读数据 */
{
if(FD_ISSET(uart01_fd, &recv_fds)) /* 先判断一下是哪个句柄可读 */
{
uiLen = read(uart01_fd,ucbuff,0xff); /* 读取串口数据 */
/*
** 数据解析
*/
}
if(FD_ISSET(uart02_fd, &recv_fds)) /* 先判断一下是哪个句柄可读 */
{
uiLen = read(uart02_fd,ucbuff,0xff); /* 读取串口数据 */
/*
** 数据解析
*/
}
}
}
}
标签:com 检查 result lse 变化 定义 超出 根据 timeout
原文地址:https://www.cnblogs.com/beyonne/p/11224730.html