×
单片机 > 单片机程序设计 > 详情

STM32学习笔记8——串口输出数据丢失问题

发布时间:2020-08-31 发布时间:
|

项目中采用STM32F103和AD7260进行数据采集。采集后想将数据通过串口逐点输出到上位机,然后查看数据是否正确。AD7260是采用外部中断进行采集的,当AD7260的BUSY输出下降沿后,触发外部中断,这时CPU去采集数据。


串口输出部分,我先是这么做的:在中断中采集数据的后面添加printf(串口已经重定向到printf函数)语句,每采集得到一个点后直接printf输出。上位机用软件SerialChart测试,发现数据经常丢失,或者出现一个很大的数(明显超出ADC的输出范围)。可初步断定,是串口输出部分出了问题。调试得出的结果很简单,但一开始走了很多弯路,如下: 

1、先是感觉串口输出被外部中断打断,在网上查串口输出和和外部中断是否会有冲突,经检查,中断优先级设置等没问题。 

2、在debug模式下,测试外部中断函数执行的时间,发现的确偏长,约3~10ms,这尼玛也太长了。这时,我直接判断可能是ADC时序的问题,又各种看数据手册,用示波器测试ADC各个管脚,没发现问题。 

3、还是在debug模式下,逐句测试各语句耗费的时间,终于逮住罪魁祸首,原来是printf函数。尼玛,我竟然没想到自己程序的问题,竟然直接怀疑串口是否应该重定向到printf了。 

4、用另一个以前测试正常的板子和程序测试printf所用时间,发现的确是ms级,我终于意识到问题了。 

5、程序波特率为9600,我在中断中每次发的数据为一个16位数据,计算下用时:8×2/9600*1000=1.667ms,就是ms级啊。


终于找到问题和解决方案所在了。那就是,串口输出速率较慢,不适合在采集中断里实时调用。要将数据通过串口输出,还是老老实实地将数据缓存,然后在主循环中输出。


注:以前都是通过缓冲数据后串口输出的(当然,程序是在别人基础上改的),这次自己偷懒,直接将快速数据串口输出,出了问题。

关键字:STM32  串口输出  数据丢失 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义