获得有关可以读取串行端口的通知

时间:2012-06-26 06:48:01

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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