使用select()作为非阻塞序列

我正在开发一个项目,我需要从串口读写数据,而这个项目需要非阻塞,因为我不会介入。 select()函数看起来像我想要使用的,但我正在努力获得一个工作的实现。

在open_port()中,我定义了端口的设置,并且它是非阻塞的。 在otherselect()中,我将描述符分配给open_port()并尝试读取。 在函数结束时,我也有1秒钟的睡眠呼叫,以避免硬件读数过快​​。

运行时,在发送消息之前,我会收到消息打印出“无数据可用”的消息,并且在发送消息之后,会将消息打印出来,但通常是随同二进制字符一起打印出来的。 例如,当发送单词“缓冲区”时,它将打印“ffer”后跟一个二进制字符。

我几乎没有经验termios或select,所以任何build议,将不胜感激。

#include <iostream> #include "stdio.h" #include "termios.h" #include "errno.h" #include "fcntl.h" #include "string.h" #include "time.h" #include "sys/select.h" using namespace std; int open_port(){ struct termios oldtio,newtio; int serial_fd; if ((serial_fd = open("/dev/ttyS0", O_RDWR | O_EXCL | O_NDELAY)) == -1) { cout << "unable to open" << endl; return -1; } if (tcgetattr(serial_fd, &oldtio) == -1) { cout << "tcgetattr failed" << endl; return -1; } cfmakeraw(&newtio); // Clean all settings newtio.c_cflag = (newtio.c_cflag & ~CSIZE) | CS8 | B115200; // 8 databits newtio.c_cflag |= (CLOCAL | CREAD); newtio.c_cflag &= ~(PARENB | PARODD); // No parity newtio.c_cflag &= ~CRTSCTS; // No hardware handshake newtio.c_cflag &= ~CSTOPB; // 1 stopbit newtio.c_iflag = IGNBRK; newtio.c_iflag &= ~(IXON | IXOFF | IXANY); // No software handshake newtio.c_lflag = 0; newtio.c_oflag = 0; newtio.c_cc[VTIME] = 1; newtio.c_cc[VMIN] = 60; if (tcsetattr(serial_fd, TCSANOW, &newtio) == -1) { cout << "tcsetattr failed" << endl; return -1; } tcflush(serial_fd, TCIOFLUSH); // Clear IO buffer return serial_fd; } void otherselect(){ fd_set readfs; timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; char * buffer = new char[15]; int _fd = open_port(); FD_ZERO(&readfs); FD_SET(_fd, &readfs); select(_fd+1, &readfs, NULL, NULL, &tv /* no timeout */); if (FD_ISSET(_fd, &readfs)) { int r = read(_fd, buffer, 15); if(r == -1){ cout << strerror(errno) << endl; } cout << buffer << endl; } else{ cout << "data not available" << endl; } close(_fd); sleep(1); } int main() { while(1){ otherselect(); } } 

当你使用read()时,你不会得到一个以null结尾的字符串,所以

 cout<<buffer<<endl 

显然是一个坏主意。 做一个,

 buffer[r]='\0' #(provided r<15) 

打印出来之前。