程序设计中遇到程序逻辑问题以及数值不对我们可以通过串口来进行调试,这样可以很明确程序的走向以及我们错在什么地方,但是有时候我们会发现一些很奇怪的问题,调试出来也不知道为什么。
由于停车场考的是串口,串口发送数据时必须要的,在写程序时遇到了以下几个问题:
-
一开始程序可以正常执行,但是加上 sprintf 之后,外加 buf 缓存数据,但是我的数组大小是20,在LED上显示数据,但是程序卡死,我当时有注释找问题,找到问题所在,但是不知道是这个buf的大小太小了,我就去设置了全局变量(下一个问题也出现在这个地方),程序正常运行。
-
改成全局变量之后运行顺畅,后面问题又来了。在程序中有设置费率以及汽车ID两个功能,都用到串口。这个难度不大,但是我在写完之后发现数据处理之后的数据不对,但是有说不出来哪里不对,当时也在模拟考,也就没又多管。但是在检查的就是发现:第一次发送数据单片机不能正常识别,第二次发送有时正确,有时不能识别,但是我直接在串口中断里面完全返回发送过去的数据,完全正确,这问题就出来了,我就猜,我的处理函数错了。
在晚上我再来看这个程序的时候,我发现我改过处理函数也不正确,然后使用串口进行一步一步的调试,然后发现数据处理错误,应该说是不知道哪里跑来的数据。然后我也不知道什么问题,就去随意加大哪些全局数组的数组大小,没想到,成功了,然后一看,**我把 u8 buf[20];
改为u8 buf[30]
,没错就是这样成功了;
反思:
-
写程序考虑数组的大小的意义,特别是有
sprintf()
函数时,有时候我们多打了个空格,少打了个空格就会超过数组的大小:局部变量容易让程序卡死,全局变量就有可能造成溢出,就相当于混进其他内存地址去了,就会让程序出现莫名其妙的错误。但是写单片机程序遵循一个变量的数据类型能小尽量小的原则,毕竟资源有限; -
写程序遇到问题要会用合适方法去找问题
网友评论