从串行端口读取确切的N个字节
Read exactly N bytes from serial port
如何从串行端口准确读取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 队列。 另一个线程在队列上等待超时。
相关文章:
- Qt Q串行端口未编程设备未关闭
- 在 linux c++ 中没有通过串行端口发送的数据
- 检查串行端口Linux中是否有传入数据(cbInQue for linux)
- 在不传输的情况下更改 Win32 中的串行端口波特率
- 增强 ASIO 和串行端口异步读取
- 串行端口写入究竟如何从缓冲区实际写入数据?
- 如何将参数这些串行端口传递到函数中
- 从 C/C++ 访问 Android 中的串行端口
- Qt两个串行端口发送和接收
- 通过串行端口从GPS传感器读取
- 提升 asio 串行端口"end of file"
- 通过串行端口发送多个值
- 与QSerialPort配合使用的串行端口仿真
- 如何通过boost::asio和shared_ptr创建串行端口
- 发送特定字节模式时串行端口数据损坏
- 从串行端口读取确切的N个字节
- 将字节发送到串行端口
- Qt串行端口有时会丢失最后一个字节
- 将十六进制字节发送到串行端口
- WriteFile到串行端口总是超时并且写入的字节数为零