Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 解析时间分隔的UART数据_Parsing_Serial Port_Uart - Fatal编程技术网

Parsing 解析时间分隔的UART数据

Parsing 解析时间分隔的UART数据,parsing,serial-port,uart,Parsing,Serial Port,Uart,在尝试对UART连接上的数据进行正确的反向工程和解码时,我得出了以下关于所接收数据格式的结论 数据以“包”的形式发送。每个数据包仅由传输之间的时间(空间)分隔 数据包长度可变。长度由序列中的第三个字节指定 数据不是使用任何特殊字符或带外信号来帧化的,但基于帧的校验和值的最终字节,有效数据包可以(假定)是有效的 当使用逻辑分析仪时,很容易识别数据包。然而,通过UART将数据传送到程序会使数据包的划分变得不可能。所有接收到的数据都由操作系统排队。虽然可以添加某些处理程序来触发接收到的数据事件,但这并

在尝试对UART连接上的数据进行正确的反向工程和解码时,我得出了以下关于所接收数据格式的结论

  • 数据以“包”的形式发送。每个数据包仅由传输之间的时间(空间)分隔
  • 数据包长度可变。长度由序列中的第三个字节指定
  • 数据不是使用任何特殊字符或带外信号来帧化的,但基于帧的校验和值的最终字节,有效数据包可以(假定)是有效的
  • 当使用逻辑分析仪时,很容易识别数据包。然而,通过UART将数据传送到程序会使数据包的划分变得不可能。所有接收到的数据都由操作系统排队。虽然可以添加某些处理程序来触发接收到的数据事件,但这并不能确保操作系统的uart队列中可用的数据将是一个完整的数据包

    是否有分离此类数据的最佳做法

    增编:

    我当前的解决方案(开销巨大,错误率高):

    从队列中的第一个字节开始,尝试分析帧。如果帧中指定的大小大于0x20(没有大于32字节的数据包-包括报头和校验和),则当前的“开始字节”被视为无效并被丢弃,重新编码从下一个字节开始,以此类推)

    我正在研究的另一个解决方案是使用微控制器解析数据并正确地对其进行帧处理,无论是带内还是带外。这是一个更好的解决方案,因为这种对时间敏感的协议应该需要RTOS。但是,必须有一种方法在普通操作系统上实现这一点

    逻辑分析仪: (第一个和第二个字节不是常量。我已经推断出第一个字节是地址(或者可能是时隙,第二个字节是数据包类型)

    我正在研究的另一个解决方案是使用微控制器

    (Modbus是一种串行协议,似乎也依赖空闲时间来划分消息帧。)

    检测此类间隙的最佳方法是使用USART/UART,该USART/UART可以在实际接收器输入处用硬件测量此间隙。任何用户空间软件解决方案都可能由于延迟而导致不准确和错误事件

    Atmel ARM(可能还有AVR32)SOC中的USART具有“接收器超时”功能。每个接收到的字符都会重新启动该计时器。在指定的间隔后(即,当一段时间内没有接收到更多字符时)会生成中断。该超时可被视为消息结束事件

    从Atmel数据表:

    接收器超时提供处理可变长度帧的支持。此功能检测RXD线路上的空闲状态。当检测到超时时,通道状态寄存器(US_CSR)中的位超时上升,并可生成中断,从而向驱动器指示帧结束


    附录

    一种可能的软件解决方案需要一个(高分辨率)周期计时器,U(S)ART驱动程序将使用该计时器来计算接收字符之间的时间间隔。使用PIO而不是DMA,驱动程序必须在接收每个字符时重置间隔的计数。当计数超过阈值时(即,
    计数
    *
    间隔时间
    >
    消息间隔时间
    ),则接收器静默时间过长,表示消息间隔

    澄清:您需要HR定时器来模拟如上所述的接收机超时。
    您不想简单地测量接收字符之间的时间间隔。

    每当“下一条”消息的开始以某种方式延迟时,就容易出现“消息腐烂”的情况,因此,在“下一条”消息到达之前,不会检测到最后接收到的消息的“结束”。

    您只能在“正常”情况下可靠地执行此操作如果你写了一个驱动程序,那么你就可以很好地保证代码从收到UART中断的那一刻起会以相当短的延迟运行。这正是我希望避免的。我有备用的AVR和2-3个收集灰尘的FPGA,这可能是我要做的。如果我不能用AVR完成它,也就是说阅读Modbus,协议似乎与Modbus RTU非常相似。谢谢!