我正在尝试从 linux 上的 c 中的串行设备读取二进制数据。问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用 select(2))返回表明设备尚未准备好读取。
我已经阅读并重新阅读了 termios 的人和所有相关的人,并在互联网上进行了搜索。我相信我正确设置了所有标志(即 VTIME、VMIN)并取消设置 ICANON。我也尝试使用函数“tcmakeraw”,但它并没有解决问题。
你们对我该怎么做有什么想法吗?
提前致以亲切的问候和感谢 Yannay
我正在尝试从 linux 上的 c 中的串行设备读取二进制数据。问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用 select(2))返回表明设备尚未准备好读取。
我已经阅读并重新阅读了 termios 的人和所有相关的人,并在互联网上进行了搜索。我相信我正确设置了所有标志(即 VTIME、VMIN)并取消设置 ICANON。我也尝试使用函数“tcmakeraw”,但它并没有解决问题。
你们对我该怎么做有什么想法吗?
提前致以亲切的问候和感谢 Yannay
您应该向我们展示代码。我将从在串口上使用 cfmakeraw 开始。一旦你的东西在原始模式下工作,你就可以进行修改并查看它是如何工作的。以下是您可以检查的问题或事项列表:
修改属性后,例如使用 cfmakeraw,您是否调用 tcsetattr(...) 来应用您的更改?
您如何证明驱动程序接收缓冲区中仍有数据?
你检查你的系统调用是否有错误?
跟踪程序的结果是什么?
根据您的评论进行编辑:您的协议“保证”.... =>检查您的假设!未经检查,清晰的保证是“不可能错误”的良好候选者
基本上:要么选择坏了,要么你的串行驱动程序。串行驱动程序被破坏的原因是硬件fifo没有足够满触发un中断,或者丢失了一个中断。
当您在您的参数/dev/ttyS0
之后直接(而不是通过 C)(或等效)阅读时会发生什么。setserial
您是否能够在 之外获取所需的数据select()
?