这两天遇到一个问题,程序中的串口运行时间长了就读不到数据了,最后发现是因为我虚拟的串口在写数据的时候发生了阻塞从而导致读串口的线程一直阻塞在写虚拟串口的操作处。我列出我程序的片段:
void vir_serial_init(char *filename){
vir_serial_fd = -1;
sfd = -1;
int ret = -1;
char spty_name[100];
memset(spty_name, '\0', 100);
ret = openpty(&vir_serial_fd, &sfd, spty_name, NULL, NULL);
if (ret == -1) {
printf("SerialPort::SerialPort:openpty returned error");
} else {
/*如果链接文件存在则将其删除*/
if ((access(filename, F_OK)) != -1) {
remove(filename);
}
symlinkat(spty_name, sfd, filename);
}
}
void serial_read_thread(void *ptr){
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 1000;
char buff[100];
while(true){
int rs = select(fd_max+1, &fd_sets, NULL, NULL, &timeout);
if(rs > 0){
if(FD_ISSET(fd1, &fd_sets)){
read_serial1();
}
if(FD_ISSET(fd2, &fd_sets)){
read_serial2();
sprintf(buff, "hello world");
//问题就发生在此处,当虚拟串口数据没有被读走时持续的写就会发生阻塞
write(vir_serial_fd, buff, strlen(buff));
}
}
}
}
上面展示了我一个线程读多个串口的方式下,写虚拟串口导致阻塞的程序实例。