查看原文
其他

显示板开发

正念君 嵌入式大杂烩 2021-01-31

点击上方「正念君编程学习笔记」,选择「置顶公众号」第一时间获取免费资料!    

正念君

一位热爱编程的程序员

工作入职几个月了,领导终于分配了点正式任务,当初做完毕业设计之后(就是一个智能天气预报系统,有兴趣的朋友可查看:智能桌面天气预报系统(一)智能桌面天气预报系统(终)就很少写嵌入式方面的代码了,直至现在快一年的时间,感觉快废了都。终于,开始进入正轨了。



这次任务为:开发个显示板(我把它叫做从机)。要求实时接收显示主机所控制的系统的当前的运行状态,其中显示部分由一个五位八段数码管组成,从机与主机之间通过串口来通信,其中由从机主动向主机申请数据,主机收到申请包之后回传一帧数据包。


当主机系统正常运行时,则会在最后三位数码管显示“run”;当伺服系统出现异常时,则会在数码管上显示“AL.XXX”,其中“XXX”为报警码,“AL”为报警单词Alarm的缩写。 



任务虽然看起来不难,但开发调试过程也遇到了很多问题 。首先,先分析一下总体设计,然后得出主要的切入点为:

(1)显示部分。可以把五段八位数码管的显示封装成一个函数,该函数接收一个字符串,然后再数码管上显示这个字符串;

(2)通信部分。接收主机数据并解析,然后把有用的数据组包(组成一个字符串,如“AL.XXX”),最后进行显示。


首先,看一下程序流程图:



显示部分

首先,由于硬件部分不按常规设计的原因,导致软件就遇到了一个问题。(有时候硬件缺陷可以使用软件来弥补,但往往会增加了软件部分的负担)。按照常规,我们的数码管段选线引脚与MCU连接应该是按连续排列的引脚顺序连接的(如,a~dp连接着PA0~PA7,这样只要给A端口的数据寄存器写一个字节的段码数据就可以进行设置了)。


但是,硬件的同事(也是新人,哈哈)把这些引脚的顺序给打乱了,所以只能靠软件来重新排列一下,既然不能同时设定8个引脚,那可以一个引脚一个引脚的进行设置。所以,我把数码管段码数据的每个位给分离出来,保存到一个数组里,然后拿这个数组的数据去直接设置数码管段选线就可以了。具体代码实现如下:



因为要拿来显示的字符数量也不多,因此我把它们都给列出来了,字符显示函数为(图片只截取函数部分内容):



所以,字符串显示函数就可以通过字符显示函数来封装了,字符串显示函数如下:



通信部分

首先,得知道从机发送数据的格式以及主机回传过来的数据格式是怎么样的。这些数据是由我们项目组自己制定的数据协议,主机回传的数据示例:

0F0601FBA3B3C3B3A3A3B3C3B3A3A3B3C3B3A3A3B3C3B3A30D


其中,0F为帧头,06为功能码,01FB为报警码,0D为帧尾。当从机向主机发送申请包时,主机收到后会回发由帧头、校验码、帧尾等多字节的一帧数据,只要可以能判断接收到这一帧数据,那么,我就可以进行解析。我的处理方法很简单,就是只要判断接收到帧头、帧尾及功能码,就说明已经接收到了这一帧数据,然后进行解析并保存数据。(应该还有其他更严谨的处理方法,以后有机会再考虑)。数据解析及组包的具体实现的代码为:



以上就是就是关于我入职以来领导给分配的第一个与写代码相关的任务,再不让我写代码我都开始怀疑我是不是一个软件工程师了。



任务最后完成得还算不错,我们的任务周期为一个月,但是,我花了几天的时间就做完了,得到了领导的认可(这或许也是我不离职的原因之一吧,希望接下来来点实在的任务,别总分配些有的没的任务)。然后上个月至今,整个大半月的时间都在摸鱼 




往期精彩

关于RT-Thread的启动问题

Windows下体验Linux环境

分享一个很酷的技巧

分享一些快速入门的教程!

【C语言笔记】操作位的技巧



你那么好看不点个好看再走吗?

Today's Feelings

点击左下角的【阅读全文】,获取本公众号往期所有笔记推送,欢迎一起交流,共同进步



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存