历史上的今天
今天是:2024年12月20日(星期五)
2018年12月20日 | STM32学习笔记8——串口输出数据丢失问题
2018-12-20 来源:eefocus
项目中采用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级啊。
终于找到问题和解决方案所在了。那就是,串口输出速率较慢,不适合在采集中断里实时调用。要将数据通过串口输出,还是老老实实地将数据缓存,然后在主循环中输出。
注:以前都是通过缓冲数据后串口输出的(当然,程序是在别人基础上改的),这次自己偷懒,直接将快速数据串口输出,出了问题。
史海拾趣
|
近年来智能交通系统发展迅速,它力图把先进的信息技术、通信技术、计算机技术、电子控制技术等高新技术有效地集成运用于整个交通运输管理体系,在大范围内建立起一种全方位的实时、准确、高教的交通运输综合管理系统。迄今为止,日本、美国、西欧、 ...… 查看全部问答> |
|
Operational amplifier gain stabilityPart 3 AC gain-error analysis 本帖最后由 dontium 于 2015-1-23 13:39 编辑 Operational amplifier gain stabilityPart 3 AC gain-error analysis … 查看全部问答> |
|
(1) MSP430 DCO振荡器频率范围是多少?我如果不用外部晶振,我进行采样或定时的时候不能准确确定采样间隔?其受温度影响到底如何? (2)MSP430F 1XX与MSP430F4XX系列中 4XX系列使用32。768K晶振时,可以精确确定DCO,而1XX则不可以,我的理 ...… 查看全部问答> |
|
今年上半年的MCU DAY还在说要推出带有铁电存储器(FRAM)的MSP430,没想就已经推出来了。铁电存储器首先是非易失性的存储器,其实还有非常快的读写速度,几乎与RAM想当。TI目前推出的带有FRAM的MSP430可以在FRAM和普通RAM上运行,若是使用FRAM即使 ...… 查看全部问答> |
|
SC16C55永远只发出每字节的低四位什么原因,高四位永远是F。 用示波器测量了SC16C55八根入口数据线数据都是对的,但是传出来的串行数据就是出现问题。有谁遇到过。… 查看全部问答> |
|
STM8L151K4如何设置才能是Active-halt mode 如题,谢谢! 我现在的程序如下,进入halt后就是不能唤醒。 CLK_LSICmd(ENABLE); /* Enable RTC clock */ CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1); /* Wait for LSE clock to be rea ...… 查看全部问答> |
|
针对论坛网友是否经常浏览门户(www.eeworld.com.cn)新闻等内容,发起本次投票,希望大家踊跃参与,为EEWORLD的更好发展贡献一份自己的力量,本帖也是SOSO回来后我发的第一个帖子就算是迎接SOSO回归啦!~… 查看全部问答> |




