一个关于串口显示屏出现异常复位和不完全显示的问题的调试和解决

-回复 -浏览
楼主 2018-06-26 09:37:41
举报 只看此人 收藏本贴 楼主

好久没有更新微信公众号“永珂在线”的文档,说声sorry,因为最近卑职实在太忙了,因为被一个小问题卡住了。其实在单片机系统、电路板、控制器、电子产品、工控测控传感自动化系统、仪器仪表、装置设备、软件EXE编程、安卓APP开发设计定制技术上我们已经很有实力和信心了,但是也不能回避的一个事实,以为做得很完美的设计、毫无瑕疵的电路图、精准简洁的程序设计,在最后调试的时候总会出现一些意想不到的问题,这些问题很简单,但是也很容易在设计的时候疏忽。

最近研制设备的之前一个版本是采用液晶屏进行参数显示,因客户要求更改为串口显示屏进行显示,这个串口屏可以用非常简单的指令进行显示,例如使用串口数据发送指令SendString("DS16(0,0,'端午节安康',1);\r\n");”,就能在串口屏的左上角(0,0)的位置处显示16*16像素大小的汉字“端午节安康”,如此简单的直接显示操作是没有任何问题的,但是问题就出现在我使用了一个变量进行显示的时候。

首先我定义了一个16位的显示变量:unsigned char xdata DIS[16];

这个变量在程序中记录了运行状态中的各种参数,例如运行模式、压力信号、流量、温度数据等,采用ASCII码格式保存。在显示子程序中调用指令“SendString(DIS);”发送数据到串口屏显示时,却出现了意想不到的问题,串口屏不能完整显示一共4行的信息,而且隔段时间串口屏复位到初始化的界面并出现闪烁。

反复检查了多次,并完全移植厂家提供的程序段到我的程序,但是问题依然存在。

最后的最后,使用串口助手commix进行查看,发现在串口数据的结尾多了一个字符“/SOH”,至今也没有想到为什么会出现这个字符,只有检查串口字符串发送的程序段:

void SendString(unsigned char *s)                                      //发送字符串

{

       while(*s)

       {

       SendData(*s++);

       }

}

发现在串口数据发送的时候,只有在遇到空字符NUL0x00)的时候发送操作才会结束,但是显示变量DIS16个字符后面并不一定会出现空字符,所以有时会出现字符“/SOH”,这会导致串口屏执行返回标题开始进入启动画面的操作。

所以,解决的方案是重新定义显示变量为unsigned char xdata DIS[17];

并将第17个元素赋值为空字符NUL(0x00),修改程序后再测试,一切OK

我要推荐
转发到