历史上的今天
返回首页

历史上的今天

今天是:2025年12月14日(星期日)

2022年12月14日 | STM32串口通信详解以及通信异常或者卡死常见问题分析

2022-12-14 来源:zhihu

异常一:数据传输中会出现乱码


数据传输中会出现乱码,很有可能是数组溢出,或者定义的数组长度不够。或者中断被打断。


异常二:程序卡在中断函数里面无法跳出执行主函数的逻辑


中断标志位没有被清除,在这里要注意一点,串口中断标志位自动清空的前提是软件需要先读USART_SR寄存器,然后读USART_DR寄存器来自动清除。即串口中断事件发生后,如果使能的接收中断,而中断函数里面什么都不执行的话,接收中断标志位是无法自动清空的,故而,函数会一直卡在中断函数里面。


比如一下这个函数,该函数没有逻辑问题,但会引发以上问题,代码如下


extern unsigned char star_time_led ;  //计时开始变量

unsigned char recv_flag = 0;//定义接受标志位

unsigned long recv_cnt = 0;//串口1接收数据缓存

unsigned char recv_buf[MAX_REV_NUM];//串口1接收数据缓存

extern unsigned char star_time;

extern unsigned char recv_time_cnt;

/*

以下写法有严重问题


如果没有这句函数→USART_ClearFlag(USART1,USART_FLAG_RXNE); //清空中断标志位


串口接收中断标志位将文法被清空,会导致函数卡在中断函数里面一直循环,无法正常运行主函数


原因分析:


中断条件成立后,中断标志位将会标记,程序将会进入中断函数运行,软件自动轻触中断标志位的条件是


先读USART_SR寄存器,再读USART_DR寄存器。


void USART1_IRQHandler(void)                //串口1中断服务程序

{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //是否发送中断事件

{

star_time = 1;         //接受到一帧数据的时候,打开软件定时器,去计数

if(recv_cnt < MAX_REV_NUM)//数组长度是否超过缓存区

{

recv_buf[recv_cnt] =USART_ReceiveData(USART1);//将接收到的数据存在数组Usart1RecBuf[RxCounter]里

recv_cnt++;

}

else

{

recv_cnt = MAX_REV_NUM

;//限制数组长度,超过缓存区则不再接收

}

recv_time_cnt = 0; //每接收到一帧数据,把定时计数器清零,相当于喂狗

                   //但是在定时器中断里面会不断的累加

USART_ClearFlag(USART1,USART_FLAG_RXNE); //清空中断标志位

}

*/

上述代码优化后如下

void USART1_IRQHandler(void)                //串口1中断服务程序

{

static char ch;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //是否发送中断事件

{

ch = USART_ReceiveData(USART1);//将接收到的数据存在数组Usart1RecBuf[RxCounter]里

star_time = 1;         //接受到一帧数据的时候,打开软件定时器,去计数

if(recv_cnt < MAX_REV_NUM)//数组长度是否超过缓存区

{

recv_buf[recv_cnt] =ch;//将接收到的数据存在数组Usart1RecBuf[RxCounter]里

recv_cnt++;

}

else

{

recv_cnt = MAX_REV_NUM

;//限制数组长度,超过缓存区则不再接收

}

recv_time_cnt = 0; //每接收到一帧数据,把定时计数器清零,相当于喂狗

                   //但是在定时器中断里面会不断的累加

USART_ClearFlag(USART1,USART_FLAG_RXNE); //清空中断标志位

}

异常三:数据发送中间歇性数据异常漏发乱发等

对于这些奇奇怪怪的问题,首先要了解一下发送函数是怎么发送的


USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。


TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。


当 TDR 内容转移到发送移位寄存器,还没有发送出去的,就再次把TDR 内容转移到发送移位寄存器里,就会出现少发的现象。


什么时候会有这种情况呢?错误操作代码如下:


void USART2_IRQHandler(void)                //串口2中断服务程序

{

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //是否发送中断事件

{

Usart1RecBuf[RxCounter] =USART_ReceiveData(USART2);//将接收到的数据存在数组Usart1RecBuf[RxCounter]里

RxCounter++;//指向数组地址自加

if(RxCounter==2) 

USART_SendData(USART1, Usart1RecBuf[0]);//发送Usart1RecBuf[0]

                USART_SendData(USART1, Usart1RecBuf[1]);//发送Usart1RecBuf[1]

USART_SendData(USART1, Usart1RecBuf[2]);//发送Usart1RecBuf[2]

}

}

}


上述代码连续运行了3次USART_SendData(USART1, Usart1RecBuf);这个函数,这种情况一般都会出现只有最后一个数据发送成功出去。原因可能就是数据还没有发送出去,发送移位寄存器就更新了。


推荐阅读

史海拾趣

DYMO公司的发展小趣事

近年来,DYMO公司越来越注重环保和可持续发展。公司采用环保材料制造产品,并推广循环使用和回收计划。此外,DYMO公司还积极参与各种环保活动,致力于减少生产过程中的碳排放和废弃物排放。这些举措不仅提高了DYMO公司的社会形象,也为其未来的发展奠定了更加坚实的基础。

APC (APC by Schneider Electric)公司的发展小趣事

进入21世纪,数据中心成为了企业信息化建设的核心。APC凭借其在UPS电源保护领域的深厚积累,稳步向数据中心市场拓展。通过并购和技术创新,APC不仅成为了首个收入达到十亿美元的以UPS为主营业务的公司,更在数据中心领域推出了多款创新产品,如InfraStruXure®架构。这一架构将电源、制冷、机架和管理无缝集成为一个模块化、可扩展的、预制式解决方案,为数据中心带来了前所未有的效率和可靠性提升。

GSN Electronics公司的发展小趣事

APC的产品和服务在全球范围内赢得了广泛认可。其InfraStruXure产品线因其集成式的电力、制冷、机架、管理和服务实现了一种开放、具有适应性且集成化的解决方案,赢得了近20个奖项。此外,APC还因其卓越的产品和业务表现,在多个年份赢得了全球100多个奖项。这些奖项不仅证明了APC在电子行业中的领先地位,也反映了其对于创新和质量的不懈追求。

西博臣(CYBERSEN)公司的发展小趣事

作为一家技术驱动型企业,西博臣始终将创新作为发展的核心动力。公司不断投入资源进行新技术和新产品的研发,积极申请各类专利和知识产权,以保护自己的技术成果。这些专利和知识产权不仅提升了公司的技术实力,也为其在市场中树立了良好的口碑。

Electroswitch公司的发展小趣事

在80年代,Electroswitch迎来了一个重要的技术突破期。公司成功开发了一系列符合MIL规格的旋转开关,这些产品凭借其坚固耐用和高品质的特性,迅速赢得了市场的认可。同时,Electroswitch还积极适应新的生产线,不断扩大在工业和电气实用市场的份额。此外,公司还成功收购了西屋电气开关部,进一步增强了其在电力行业中的竞争力。

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

问答坊 | AI 解惑

Wince5.0 direct3d问题,请指点一下,谢谢!

公司找的外包软件公司需要direct3d功能,对此不了解,所以有几个问题想请教一下: 1、外包公司一直提到direct3d.dll,而WINCE5.0中有d3dm.dll,两者之间的关系是类似于MDD与PDD之间的关系还是同等关系? 2、看他们软件介绍是需要Pocket PC\\Windo ...…

查看全部问答>

已经实现开机自动运行程序,关于输入的一点问题

我按照网上查到的方法 用自己的程序替换掉了explorer.exe [HKEY_LOCAL_MACHINE\\Init] \"Launch50\"=\"myapp.exe\" \"Depend50\"=hex:14,00,1e,00 编译的系统能够运行,并且程序全屏。 我的疑问是,我想在程序的界面中输入东西怎么办? 我看不 ...…

查看全部问答>

MMI 3002514 是什么?

micro motion 公司的MMI 3002514是什么器件啊?…

查看全部问答>

vxworks下用usb驱动d12芯片的问题?

vxworks下用usb驱动d12芯片,要注意哪些关键的地方?可以指点一下吗? 谢谢! …

查看全部问答>

基于MSP430扩展外部FLASH MEMORY系统的介绍

介绍如何扩展FLASH MEMORY,在MSP430系统上…

查看全部问答>

轻松下吧!多少人在应用手册中见过这个

能猜出来的,芯币奖励,大奖50枚!…

查看全部问答>

FPGA与51单片机通讯的问题

我现在在做一个频率计,用FPGA做数据采集,51单片机做显示,数据通信上我说一下我的思路,当P3-0口为低电平,其他为高电平时,FPGA的数据口传送给P1口一组8位数据,当P3-1口为低电平,其他为高电平时,FPGA的数据口再传送给P1口一组8位数据,一共四 ...…

查看全部问答>

手机现代化应用大棚远程监控系统

  [手机远程无线温湿度监控系统]   [无线温湿度监控系统]   【手机温湿度监控系统】   农业大棚温湿度监控系统方案   本文编辑 九纯健刘重庆     本方案主要是针对手机检测大棚温湿度所开发设计 ...…

查看全部问答>

关于FPGA电压的问题

由于我电路设计失误,导致VCCA本来应该2.5V的供电现在大约2.3V,不知道这个影响FPGA的工作吗? 我程序烧写是正常的,但是程序不是立刻执行,过了得有半分钟才开始执行? 这个和电压不够有关系吗? 谢谢啊…

查看全部问答>