从串行端口读取确切的N个字节

Read exactly N bytes from serial port

本文关键字:字节 串行端口 读取      更新时间:2023-10-16

如何从串行端口准确读取N字节?我需要我的线程阻塞,直到端口上至少有 N 字节可用或预设超时已过期。在运行时,超时值和N都应该是可变的。

注意:在使用 C/C++ 的 Linux 上,有或没有 boost。

termios 中有VMIN属性用于此目的。它可用于防止read()在没有足够的可用字节时返回。

例:

tcgetattr( fd, &termiosv );
termiosv.c_cc[VMIN]  = N;
termiosv.c_cc[VTIME] = 20;
tcsetattr( fd, TCSANOW, &termiosv );

有关 VMIN 的更多信息。

注意:它确实会影响select():选择表示当只有 1 个字节可用且 VMIN> 1 时 fd 可读性。

不幸的是,正如 Hans 所暗示的那样,仅通信字节流的通信通道通常没有任何魔术调用来阻止将字节阻塞到协议单元中 - 您必须自己做。 这并不难。

类似的超时。 COM 端口驱动程序通常有一个超时,当某个时间间隔内没有收到字节时触发,但这不能使比该字节更复杂的任何类型的协议单元超时。 如果我需要做类似的事情,我通常使用一个线程来接收字节并组装协议单元对象,直到它们完成并经过健全性检查,然后将它们推送到 P-C 队列。 另一个线程在队列上等待超时。