其他分享
首页 > 其他分享> > 一个调了好几天的带迪文屏的小项目总结

一个调了好几天的带迪文屏的小项目总结

作者:互联网

功能需求:

1迪文屏显示数据

2接收迪文屏上的按键指令

3读取迪文屏上的数据

4采用串口方式

问题:

1中断死机

2无法正确接收迪文屏的按键和数据

解决办法:

1死机:

串口中断响应函数中增加

if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
    USART_ClearFlag(USART1, USART_FLAG_ORE);
}

用于清除标志位   

原因是:串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)

详细情况参考这两位博主的博客,讲的很详细,第一位博主还指出了文档的翻译错误。

虽然我不是参考这两位博主的资料,但还是记录一下,方便以后学习研究

https://blog.csdn.net/love_maomao/article/details/8234039

https://blog.csdn.net/qq_34401994/article/details/76359581

为什么串口接收数据过多,就是下面要讲的一个问题。

2无法接收按键指令和数据

把显示数据的发送条件进行修改,一开始是循环一次发一次数据,修改之后的方案是只有数据发生实质性的变化之后才发送给液晶屏

原因是:向迪文液晶屏发送数据的时候,液晶屏会自动回传一组指令,由于大循环的时间间隔很短,那么单片机的串口就一直有数据在接收,导致上面的溢出错误,虽然通过清除标志位的方式解决死机问题,但是按键指令和读取数据之后的回传指令已经被大量的无用回传指令(即向液晶屏发送指令,液晶屏的回传指令)给淹没掉了,那么出现这种问题也就不意外了

进阶:按照上面的方案修改软件之后,按键的指令也是时灵时不灵,一开始以为是循环时间间隔长了,导致延迟,仔细分析之后发现不是这个原因,因为就算间隔时间长,那么也是响应慢,但是不会不响应,肯定是其它原因造成。继续边调试边分析程序执行的过程,原因找到了。接收到无用指令后,如果此时按键也跟着发指令,那么两种指令就混合在一起,这时候按键就不灵,如果两种指令分开了,那么这时候按键指令就有效了,为了避免此种情况,直接把无用指令给屏蔽掉,这样,单片机就只接收有效指令,经过测试,该问题也解决了。

 

 

总结:

1不能因为项目小就乱写程序,还是按照正常的框架结构进行设计

2调试的时候不能光看结果,还需要去分析程序执行的过程,不可以没有根据的瞎猜瞎想

3对于调试时候view的数据结果要分析原因

4标志位的使用一定要尽量全的分析可能性,还要保证所有的可能性能循环起来

 

标签:总结,带迪文屏,迪文屏,串口,几天,液晶屏,指令,按键,回传
来源: https://www.cnblogs.com/helouxuan04372/p/12779534.html