0

我正在尝试从 linux 上的 c 中的串行设备读取二进制数据。问题是,有时驱动程序的内部缓冲区中有字符,但轮询(使用 select(2))返回表明设备尚未准备好读取。

我已经阅读并重新阅读了 termios 的人和所有相关的人,并在互联网上进行了搜索。我相信我正确设置了所有标志(即 VTIME、VMIN)并取消设置 ICANON。我也尝试使用函数“tcmakeraw”,但它并没有解决问题。

你们对我该怎么做有什么想法吗?

提前致以亲切的问候和感谢 Yannay

4

2 回答 2

1

您应该向我们展示代码。我将从在串口上使用 cfmakeraw 开始。一旦你的东西在原始模式下工作,你就可以进行修改并查看它是如何工作的。以下是您可以检查的问题或事项列表:

  • 修改属性后,例如使用 cfmakeraw,您是否调用 tcsetattr(...) 来应用您的更改?

  • 您如何证明驱动程序接收缓冲区中仍有数据?

  • 你检查你的系统调用是否有错误?

  • 跟踪程序的结果是什么?

根据您的评论进行编辑:您的协议“保证”.... =>检查您的假设!未经检查,清晰的保证是“不可能错误”的良好候选者

基本上:要么选择坏了,要么你的串行驱动程序。串行驱动程序被破坏的原因是硬件fifo没有足够满触发un中断,或者丢失了一个中断。

于 2011-01-07T13:40:59.033 回答
0

当您在您的参数/dev/ttyS0之后直接(而不是通过 C)(或等效)阅读时会发生什么。setserial您是否能够在 之外获取所需的数据select()

于 2011-01-06T18:02:36.203 回答