【问题标题】:Missing characters using read() from unistd.h使用 unistd.h 中的 read() 缺少字符
【发布时间】:2011-02-21 19:52:31
【问题描述】:

我们使用unistd.h 中的read() 方法在Linux 环境中从串行端口接收数据。专门从/dev/ttys1 读取数据。

我们收到的部分数据包括字符0x0A(换行)和0x0B(垂直制表符),但库似乎忽略了它们。

我的意思是,我们使用unsigned char[]来存储从端口获取的数据,并且数组包含除了这些字符之外的所有数据。

你认为可能有什么问题?

【问题讨论】:

  • 你是如何打开文件描述符的?有时,open() 调用的某些选项会影响您在读取时从文件中获取的数据。
  • unistd.h 不是库。它是一个标题。
  • serial_fd = open(SerialPort, O_RDWR | O_NOCTTY | O_NONBLOCK );
  • @WilliamPursell 好的,我明白了。

标签: c++ linux serial-port std unistd.h


【解决方案1】:

tty?您确定将终端驱动程序置于正确的状态以传递这些字符吗? (参见 tcgetattr 和 tcsetattr)。根据您的精确设置,您可以使用 stty 程序以交互方式使用这些设置。

【讨论】:

  • 我们正在接收数据并且我们之前使用过'tcsetattr()'。因此,根据您的建议,我们正在寻找可能导致缺少字符的属性。非常感谢
  • @SDReyes:特别是,您可能希望使用cfmakeraw() 设置原始模式。
【解决方案2】:

你怎么知道你应该阅读 0x0A 和 0x0B ?您是否使用任何机制来“调试”线路以确定您应该阅读的消息是什么? read() 函数不对正在读取的数据做任何假设,因此如果丢失了任何字节,则应该在程序的任何其他部分中。

希望对您有所帮助。 谢谢, 塞尔吉奥。

【讨论】:

  • 嗨 Sergio -btw 你的名字很酷,恭喜-,我们有一个使用相同设备的 .Net 应用程序,它需要 0x0A 和 0x0B 字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2015-03-15
相关资源
最近更新 更多