STM32串口通信详解以及通信异常或者卡死常见问题分析

发布时间:2022-12-14  

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


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


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


中断标志位没有被清除,在这里要注意一点,串口中断标志位自动清空的前提是软件需要先读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);这个函数,这种情况一般都会出现只有最后一个数据发送成功出去。原因可能就是数据还没有发送出去,发送移位寄存器就更新了。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    STM32单片机如何处理QT上位机串口中发过来的数据?;首先,在使用STM32单片机处理QT上位机串口中发过来的数据前,需要了解一些基础知识。1. 串口通信串口通信指的是通过串口进行数据传输的通信......
    嵌入式硬件通信串口启用流程;一、串口启用流程 开讲前,先找几款芯片的串口demo程序瞄一眼。 依次有STM32的V3.5标准库、nRF52832的官方demo以及51核的STC15系列......
    法也是我推荐的方法,和计数法大同小异。发送程序参考计数法,相信是件很容易的事。 另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用RXD、TXD、GND。 附:51 IO口模拟串口......
    验)或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 · 停止位:表示一帧数据的结束。电平逻辑为“1”。 · 波特率:串口通信时的速率,它用......
    发送,一根RXD用于接收。推荐文章 : STM32与51单片机串口通信实例 。 UART的串......
    址选择从机。 RS232串口通信 传输线有两根,地线一根。电平是负逻辑: -3V~-15V逻辑“1”,+3V~+15V逻辑“0”。 RS-232串口通信传输距离15米左右。可做到双向传输,全双工通讯,传输......
    =1234 蓝牙配对密码为1234 AT+UART=9600,0,0 蓝牙通信串口波特率为9600,停止位1位,无校验位 5.模块指示灯说明 1.将模块上电同时(或者之前),将KEY接高电平,此时......
    通信串口各一个。通过对该模块的编程,可实现与外围设备的各种通信。本系统通过ASCII模块与DCS基于Modbus协议的通信,将DCS的读、写指令及数据做相应转换,并与PLC的CPU单元......
    条件等多方面原因的限制,现场运行的设备很难在就地进行程序升级。因此,本文探讨了如何利用设备现有的RS-232数据通信串口进行远程的程序升级方法。 1 设备硬件构成 下面针对一台现场在线运行的F2812监控......
    的闪存、3 路通信串口、4 个定时器与1 个控制器局域网(controller area network,CAN) 接口。 2.2 通信模块 机器人本体的主控制器通过串口转网口模块与交换机连接,机器......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>