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

16 篇文章 1 订阅

项目中采用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级啊。

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值