示波器协议解码小问题中的大学问

2016-04-13

案例分析

南京某公司在使用我们的M287-128WI ARM9核心板研发一款车载设备产品,需要使用M287-128WI核心板的串口与客户外购的车载设备对接通讯。这款外购车载设备给的串口设置参数为:波特率9600;数据位8位;停止位0;校验位无。于是客户把M287-128WI的串口配置按照以上参数进行配置,并进行通讯。但是整个通讯过程中,M287-128WI接收外购车载设备的串口数据一直出现数据丢包的情况,并多次质疑M287-128WI串口驱动存在BUG。我公司软件工程师对软件驱动进行逐一排查,但一直未找到问题的根源,于是决定上门进行支持!

解码不正确

到了现场,我们在假设软件没有BUG的情况下,那么寻找问题思路就转到外购的车载设备串口总线的实际信号,因为信号波形是数据分析的直接源头,是问题本质的反映。于是使用致远ZDS2022示波器观察外购的车载设备串口信号波形情况,在高达330Kwfms波形刷新率下,打开一键余辉功能,并没有发现异常信号,这说明串口上是没有干扰信号的,符合串口的电气规范。

接下来就是要利用ZDS2022示波器的串口协议解码功能对数据流进行分析。按照设备的资料,将ZDS2022示波器参数配置为:波特率设置为9600;数据位为8位;停止位为0;校验位为无(注意RS232 电平跟 TTL的232 电平是相反的,如果测试RS232电平,需要将电平设置为反相,需要设置为TRUE),设置结果详见图1。


图1 协议参数设置

ZDS2022示波器输入参数设置完后,会对波形自动解码。但问题来了,出现了如图2中解码的界面。很明显,图2中有一段信号ZDS2022示波器并没有有效解码,这到底是怎么回事呢?


图2 UART协议解码

分析问题

UART协议的帧包格式主要包含四个段:开始位、数据段、校验位(可有可无)和停止位。停止位的位数可以设置为1位或者2位,数据值为1。


图3 UART协议格式

外购车载设备肯定是UART协议,而且波特率确定是9600,数据位宽也是确定的,但为什么没有正确解码呢?我们先假设如图4中橙色实线框中解出来的数据是正确的,并可知解码数据包含起始位、数据位和停止位。由于该协议波特率和位宽固定,所以猜测一帧的长度大约为1ms,在图4实线框中波形后面出现一段空闲电平,然后出现一个上升沿,我们假设该上升沿后为起始位,根据猜测,一帧的长度大约为1ms,确定可能的停止位,如图4中橙黄色虚线框内波形,很明显,该停止位根本就不符合逻辑,起始位为逻辑0(表现为高电平),停止位应该为逻辑1(表现为低电平),所以该停止位是无效的,故该帧没有有效解码。同样,第二个虚线框中的协议波形也是一样,猜测可能停止位设置不符合逻辑,造成ZDS2022示波器没能有效的对波形进行解码。


图4 UART协议解码分析图

我们观察到,两个虚线框中可能的UART帧的结束位全都表现为高电平(与可能的开始位是相同的逻辑0),该特征表明可能存在一个校验位。我们假设该协议中包含一个校验位,在图4中橙色虚线框波形中,原来可能的逻辑0(表现为高电平)的停止位就变成了逻辑0的校验位,如此一来,原来的停止位就变成逻辑1(表现为低电平)了。并根据之前观察的波形特征来看,两虚线框中可能的结束位全都是逻辑0,而正好符合Space(逻辑总为0,与开始位的逻辑相同)的特征。根据假设,重新对ZDS2022示波器UART协议进行了参数设置,增加一位Space的校验位。


图5 参数设置加入校验位

当添加一位校验位后,我们得到如图6的解码界面,该UART协议已经正确解码!


图6 加入校验位后解码界面图

数据触发,再次验证

在确认串口设置(波特率9600;数据位8位;停止位0;校验位Space)后,由于ZDS2022示波器不仅具有强大的协议解码功能,同时支持21种协议触发功能。将ZDS2022协议触发设置成ON,可对协议触发参数进行设置,由于设备的帧协议已经明确标示,数据帧中会存在0xEE,0xC0开头的数据和0xCC结尾的数据,将触发模式设置为数据触发,触发数据设为0xC0。如图7所示。


图7 数据触发设置

协议触发参数设置完成后,得到图8的协议触发波形,由图可见,触发点已精确触发在0xC0处,定位迅速,十分准确!由此成功的数据触发操作,再次验证了对该协议的各种参数设置的正确性。


图8 数据触发解码界面图

解决问题

借助ZDS2022示波器强大的协议解码功能,我们已经分析清楚了设备的串口通讯的协议设置情况(波特率9600;数据位8位;停止位0;校验位Space),而非之前的提到的串口设置参数(波特率9600;数据位8位;停止位0;校验位无)。下一步是就解决i.MX28X的通讯串口驱动问题。由于i.MX28X处理器的串口外设不支持Space校验位设置,通讯过程中,驱动对校验失败的数据进行丢弃处理,因此就造成文章开头的丢数据的原因。通过驱动软件修改,抛弃串口校验功能,将原来丢弃的数据强制转发给应用程序,成功地接收了设备发送过来的串口数据。

小结

在项目软件开发过程中,经常会碰到了各种各样的通讯设备通讯失败问题,可以使用ZDS2022示波器的21种协议触发与解码功能对原始信号分析,而且21种协议触发与解码功能完全免费开放。如本文中用到UART协议分析,支持多种参数设置,不仅包括奇校验、偶校验、Mark、Space和None 这5种校验模式,还包括开始位与数据触发模式。详细的参数设置帮您精准分析协议,快速定位问题,大胆做出假设,迅速解决问题,值得信赖!

当问题解决后,您收获的不仅是体验到了ZDS2022协议触发与解码的功能的强大,更重要的是您收获了一个解决问题的推理思维!


图9 演示现场

广州致远电子股份有限公司朱经理现场演示ZDS2022串口协议触发与解码功能来分析设备的通讯串口协议数据。

0.0137s