在尝试对UART连接上的数据进行正确的反向工程和解码时,我得出了以下有关所接收数据格式的结论。
使用逻辑分析仪时,很容易识别数据包。但是,通过UART将数据传送到程序会使分组数据包不可能。所有接收的数据都由操作系统排队。虽然可以添加某些处理程序来触发数据接收事件,但这并不能确保OS的uart队列中可用的数据将是整个数据包。
是否有分离此类数据的最佳做法?
附录:
我目前的解决方案(开销很大,错误率很高):
从队列中的第一个字节开始,尝试解析一个帧。如果帧中指定的大小大于0x20(没有大于32字节的数据包 - 包括报头和校验和),那么当前的"起始字节"被认为是无效的并被删除,并且从下一个字节继续重新定义等)
我正在研究的另一个解决方案是使用微控制器来解析数据并对其进行正确的帧化,无论是带内还是带外。这是一个更好的解决方案,因为这样的时间敏感协议应该需要RTOS。但是,必须有一种方法可以在普通的操作系统上实现这一点。
逻辑分析仪: (第一个和第二个字节不是常量。我已经推断出第一个字节是一个地址(或者可能是一个时隙,第二个字节是一个数据包类型)。
答案 0 :(得分:1)
我正在研究的另一个解决方案是使用微控制器
(Modbus是一种串行协议,似乎也依赖空闲时间来分隔消息帧。)
检测此类间隙的最佳方法是使用USART / UART,可以使用实际接收器输入端的硬件进行测量。任何软件解决方案都可能因延迟而容易出现不准确和错误事件。
Atmel ARM(也许是AVR32)SoC中的USART具有“接收器超时”功能。每个接收的字符重新启动此计时器。在指定的间隔之后(即,暂时不再接收到字符时)可以产生中断。此超时可被视为消息结束事件。
来自Atmel数据表:
接收器超时为处理可变长度帧提供支持。此功能可检测RXD线路上的空闲状况。当检测到超时时,通道状态寄存器(US_CSR)中的TIMEOUT位上升并产生中断,从而向驱动器指示帧结束。
ADDENDUM
可能的软件解决方案需要(高分辨率)周期性定时器,U(S)ART驱动程序将使用该定时器来计算接收字符之间的时间间隔。使用PIO而不是DMA,驱动程序必须在收到每个char时重置count_of_intervals。当计数超过阈值(即count
* interval_time
> inter_message_gap_time
)时,接收方已沉默太长时间,表明消息间存在差距。