我在 Linux 系统中从串口读取数据时遇到问题。我正在尝试使用 UART 将传感器连接到 linux 系统。我可以读写/deve/ttyS1。但问题是我不想轮询来自 UART 的消息。相反,我想使用异步模式来获取数据。随着数据的到来,回调函数会进入某个例程并运行我的代码。问题不在于传感器向我发送了不同的数据包,每个数据包都包含不同字节的数据。他们每隔一秒就会来一次!
例如:
Time Sensor MyLinux
1s 50bytes
124bytes
2s 40bytes
174bytes
3s 60bytes
244bytes
我的问题是如何使用异步串行编程,以便在回调函数中,可以将这两个数据包读取为两条消息
说 50字节来了,回调函数可以让我读取50字节 127 bytes来了,回调函数可以让我读取127 bytes
现在,好像是,50字节来了,我只能读取27字节,剩下的23字节在下一条消息中。
我在 POSIX 中对串口的设置是:
/* now we setup the values in port's termios */
serial->tio.c_cflag=baudrate|databits|checkparity|stopbits|CLOCAL|CREAD;
serial->tio.c_iflag=IGNPAR;
serial->tio.c_oflag=0;
serial->tio.c_lflag=0;
serial->tio.c_cc[VMIN]=28;
serial->tio.c_cc[VTIME]=6;
/* we flush the port */
tcflush(serial->fd,TCOFLUSH);
tcflush(serial->fd,TCIFLUSH);
/* we send new config to the port */
tcsetattr(serial->fd,TCSANOW,&(serial->tio));
最佳答案
尝试将 VMIN 和 VTIME 设置为以下值:
serial->tio.c_cc[VMIN]=0;
serial->tio.c_cc[VTIME]=1;
然后您将从传感器读取完整数据 block 后退出 select()。如果字节数少于您的预期,您可以为选择设置超时并再次读取附加到当前缓冲区的数据。如果您在超时之前获得数据,那么您将获得完整的消息。
关于c - 异步模式下的Linux串口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19631891/