1

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

4

1 回答 1

0

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

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

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

于 2012-06-27T04:03:13.333 回答