4

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

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

4

2 回答 2

2

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 时,Select 表示 fd 可读性。

于 2012-12-19T13:26:11.447 回答
1

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

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

于 2012-12-19T12:24:21.940 回答