如何从串口读取N
个字节?我需要阻塞我的线程,直到端口上至少有N
个字节可用或预设的时间已过期。在运行时,timout值和N
都应该是可变的。
注意:在使用C / C ++的Linux上使用或不使用boost。
答案 0 :(得分:1)
不幸的是,正如Hans所暗示的那样,通信通道只传输字节流通常不会有任何神奇的调用来阻止字节进入协议单元 - 你必须自己做。这并不困难。
同样超时。 COM端口驱动程序通常具有超时,当在某个时间间隔内没有接收到任何字节时会触发该超时,但这不会超出任何比这个字节更复杂的协议单元。如果我需要做类似的事情,我通常使用一个接收字节的线程并组装协议单元对象,直到它们完整并经过完整性检查,然后将它们推送到P-C队列。另一个线程在超时时等待队列。
答案 1 :(得分:1)
为此目的,termios中有VMIN
个属性。当没有足够的可用字节时,它可用于防止read()
返回。
示例:
tcgetattr( fd, &termiosv );
termiosv.c_cc[VMIN] = N;
termiosv.c_cc[VTIME] = 20;
tcsetattr( fd, TCSANOW, &termiosv );
注意:
它对select()
有效:当只有1个字节可用且VMIN>时,选择表示fd可读性。 1。