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⊙)…

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要让串口每隔1秒发送数据,但不影响接收数据,可以采用以下的方法。 首先,需要设置串口的发送和接收缓冲区。发送和接收缓冲区是通过串口芯片内部的FIFO(先进先出)队列来实现的。发送数据时,将数据写入发送缓冲区;接收数据时,从接收缓冲区读取数据。这样可以提高数据的传输效率,并且不容易丢失数据。 其次,可以使用定时器来实现定时发送。定时器可以设置一个周期,当达到这个周期时就会触发一个中断,可以在中断处理函数中进行发送操作。具体来说,可以选择一个合适的定时器(比如51单片机中的定时器0),设置合适的计数器初值和计数器模式,使其在1秒内溢出一次。在中断处理函数中,可以编写发送操作的代码,将数据发送出去。 最后,为了不影响接收数据,要保证串口的发送和接收操作互不干扰。可以通过在关键位置加锁或者使用标志位来实现。在发送操作之前,可以先检查接收缓冲区中是否有数据,如果有数据正在接收,可以等待一段时间后再进行发送。同时,在接收操作过程中,要确保不会被发送操作中断。可以通过设置标志位,在接收操作开始时将其置位,在发送操作开始时检查该标志位是否被置位,如果被置位则等待发送操作结束后再进行接收。 综上所述,通过设置串口的发送和接收缓冲区,利用定时器实现定时发送,并且在发送和接收操作中加锁或使用标志位来避免干扰,可以实现每隔1秒发送数据但不影响接收数据的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值