c++ - 获取串行端口已准备好读取的通知

标签 c++ linux serial-port hardware embedded-linux

我必须编写一个 C++ 应用程序,逐字节读取串行端口。这是一个重要的需求,因为它使用 modbus 通过 radio 传输接收消息,传输结束由 3.5 个字符长度持续时间定义,因此我必须能够逐字节获取消息。当前系统利用 DOS 来执行此操作,它使用硬件中断。我们希望转为使用 Linux 作为该软件的操作系统,但我们缺乏这方面的专业知识。我已经尝试了很多方法来做到这一点——首先使用非阻塞读取的轮询,使用具有非常短超时值的选择,将串行端口的读取缓冲区的大小设置为一个字节,甚至使用信号处理程序SIGIO,但这些东西都不能满足我的要求。我的老板告诉我,我们当前运行的 DOS 应用程序使用硬件中断在有可从串行端口读取的内容并且可以直接访问硬件时获得通知。有什么方法可以从用户空间 Linux 应用程序中获得此功能?如果我编写自定义驱动程序(尽管以前从未这样做过并且对内核的工作原理几乎为零),我可以这样做吗??。我听说 Linux 是一种非常流行的硬件控制和嵌入式设备操作系统,所以我猜想这种事情一定有可能以某种方式完成,但到目前为止我已经花了数周时间,但仍然没有具体的想法最好继续。

最佳答案

我不太确定逐字节读取如何帮助您接收小数字符,除非是在字符之间的间隔持续时间内编码了信息,因此您需要知道它们何时出现的时间收到。

无论如何,我怀疑您需要对串行端口内核驱动程序进行自定义修改;就项目而言,这并没有那么糟糕,您会学到很多东西。您可能还需要更改 UART“芯片”(实际上只是一些较大设备的一个小角)的配置,使其仅在一个字节后中断(即模拟 16450),而不是通常为 16 字节(在 16550 处模拟)缓冲区中途已满。 dos 程序的代码实际上可能在那里提供帮助。如果波特率不是太快,另一种方法是轮询内核中的硬件或实时扩展(或者如果它真的很慢,因为它可能在 HF radio 链路上,甚至可能在用户空间中)

如果我需要知道字符接收的时间是正确的,另一种选择是将接收卸载到具有双 UART(或者更好,一个 UART 和一个 USB 接口(interface))的微 Controller 。然后你可以让微型观察串行流,并输出到 PC(以更快的波特率在另一个串行端口上,或在 USB 上)包含一个接收到的字符和时间戳的小数据包 - 甚至让它为您解码协议(protocol)。这样做的好处是它会让你独立于操作系统,并且可以在遗留的免费机器上工作(逐字节访问可能会因现成的 USB 串行加密狗而失败)。您甚至可以用一些便宜的评估板来制作它,而不必制造任何定制硬件。

关于c++ - 获取串行端口已准备好读取的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202039/

相关文章:

c++ - 使用 lower_bound 的结果作为 upper_bound 的参数(反之亦然)

javascript - 我需要做什么才能启动并运行 JS3 环境(或至少是 couchdb)?

linux pl011串口驱动: do not output after open/dev/console

c# - "Cross thread operation not valid"..在串行端口上读取数据时

c++ - 运算符重载问题

c++ - 使用 C++ 运行一个进程,过滤输出并获取结果代码并获取系统错误,全部一起

java -/usr/bin/ld : cannot find -ljvm:during compiling jni project

python 值到远程服务器上的 bash 行

c# - SerialPort.ReadLine() 不从 Arduino 发送的 USB COM 端口读取数据

c++ - 合并查找以查看形状是偏向一侧还是偏向另一侧