1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!
这次任务为:开发个显示板(我把它叫做从机)。要求实时接收显示主机所控制的系统的当前的运行状态,其中显示部分由一个五位八段数码管组成,从机与主机之间通过串口来通信,其中由从机主动向主机申请数据,主机收到申请包之后回传一帧数据包。
当主机系统正常运行时,则会在最后三位数码管显示“run”;当伺服系统出现异常时,则会在数码管上显示“AL.XXX”,其中“XXX”为报警码,“AL”为报警单词Alarm的缩写。
任务虽然看起来不难,但开发调试过程也遇到了很多问题 。首先,先分析一下总体设计,然后得出主要的切入点为:
(1)显示部分。可以把五段八位数码管的显示封装成一个函数,该函数接收一个字符串,然后再数码管上显示这个字符串;
(2)通信部分。接收主机数据并解析,然后把有用的数据组包(组成一个字符串,如“AL.XXX”),最后进行显示。
首先,看一下程序流程图:
首先,由于硬件部分不按常规设计的原因,导致软件就遇到了一个问题。(有时候硬件缺陷可以使用软件来弥补,但往往会增加了软件部分的负担)。按照常规,我们的数码管段选线引脚与MCU连接应该是按连续排列的引脚顺序连接的(如,a~dp连接着PA0~PA7,这样只要给A端口的数据寄存器写一个字节的段码数据就可以进行设置了)。
但是,硬件的同事(也是新人,哈哈)把这些引脚的顺序给打乱了,所以只能靠软件来重新排列一下,既然不能同时设定8个引脚,那可以一个引脚一个引脚的进行设置。所以,我把数码管段码数据的每个位给分离出来,保存到一个数组里,然后拿这个数组的数据去直接设置数码管段选线就可以了。具体代码实现如下:
因为要拿来显示的字符数量也不多,因此我把它们都给列出来了,字符显示函数为(图片只截取函数部分内容):
所以,字符串显示函数就可以通过字符显示函数来封装了,字符串显示函数如下:
首先,得知道从机发送数据的格式以及主机回传过来的数据格式是怎么样的。这些数据是由我们项目组自己制定的数据协议,主机回传的数据示例:
0F0601FBA3B3C3B3A3A3B3C3B3A3A3B3C3B3A3A3B3C3B3A30D
其中,0F为帧头,06为功能码,01FB为报警码,0D为帧尾。当从机向主机发送申请包时,主机收到后会回发由帧头、校验码、帧尾等多字节的一帧数据,只要可以能判断接收到这一帧数据,那么,我就可以进行解析。我的处理方法很简单,就是只要判断接收到帧头、帧尾及功能码,就说明已经接收到了这一帧数据,然后进行解析并保存数据。(应该还有其他更严谨的处理方法,以后有机会再考虑)。数据解析及组包的具体实现的代码为: