我必须用 C 编写一个代码来检测 Linux 上 rs232 线路内的字符间时间。检测的字符间时间可能是 1ms。所以我需要一些东西来非常快速地为传入的字符加盖时间戳。我说的非常快速是指少于 1ms。目标是检测线路上一帧的结束和新帧的开始。
我不要求编码解决方案,我只是想要初步的帮助,以便知道我必须采取什么途径:在 Linux 上可以做到这一点吗?我必须修改驱动程序才能达到这种时间?或者用户空间上的某些东西可以做到这一点(我不这么认为)。
答案1
那是板载 UART 还是 USB 加密狗?对于前者,我会修改串行驱动程序中断例程,将数据与时间戳一起存储,将带有时间戳的数据传送到用户空间,然后让用户空间对其进行排序。虽然 Linux 不是实时的,但我希望它能够在不到 1 毫秒的时间内响应所有中断,所以这应该足够了。
对于 USB 加密狗,usbmon
已经提供了以微秒为单位的时间戳,因此我猜测应该能够usbmon
与普通串行 USB 驱动程序一起使用,并修改串行 USB 驱动程序以使这些时间戳可访问。
答案2
我必须用 C 编写代码来检测 Linux 上 rs232 线路内的字符间时间......
您发布了XY问题。
我想这样做是因为超过 1ms 的静默意味着一帧的结束和一个新帧的开始。
(顺便说一句,在异步串行通信中,如RS-232,不合格的使用“框架”是模棱两可的,因为每个字符都是框架化的。例如,当 UART 报告“帧错误”时,一个字符(可能)丢失了。大概你实际上指的是数据包或消息单元。)
您的补充评论最终揭示了需要解决的实际 X 问题。
由于实际问题是检测消息间间隙,您最初关于 Y 的问题不仅难以在软件中准确实现,而且甚至不是解决 X 问题的可行方法。
任何涉及通过软件“测量”接收字符之间的时间间隔以检测消息间间隙的解决方案都是有缺陷的解决方案。这种方法在退化情况下会失败:
当消息的最后一个字符到达时,如果(一段时间内)没有其他字符,那么最后收到的消息就是停滞无限期地等待下一个字符(下一条消息的第一个字节),以便计算时间差。
只要没有收到“下一个字符”,就无法确定“消息结束”,最后一条有效消息虽然完整,但尚未处理。
正确的解决方案是使用可以测量字符是否已接收的硬件。一些 Atmel USART 具有接收器超时检测消息间差距的功能。
一种可能的软件解决方案是需要一个(高分辨率)周期性计时器,U(S)ART 驱动程序将使用它来计算接收字符之间的时间间隔。使用 PIO 而不是 DMA,驱动程序必须在收到每个字符时重置间隔计数。当计数超过阈值(即 count * interval_time > inter_message_gap_time)时,接收器静默时间过长,表明存在消息间间隙。