微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32串口接收中断问题

STM32串口接收中断问题

时间:10-02 整理:3721RD 点击:

  1. void USART1_IRQHandler(void)
  2. {
  3.         uint16_t Got_Data;
  4.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  5.         {
  6.                 Got_Data=USART_ReceiveData(USART1);//1
  7.                 delay_ms(10);//2.
  8.                 USART_SendData(USART1,Got_Data);//3
  9.         }
  10.        
  11.        
  12. }

复制代码

上面这段中断处理函数由于我故意在里面加了个10ms延时,所以造成发出的和接收的不一致。
问题是:
1.在接收到第一个数据后,进入10MS延时时,第二个数据来了,那么还会触发中断么?我看说明书是说如果读了数据寄存器,那么标志位会清0,那么即使还没有退出这个函数,但是已经可以再次触发中断了,是不是意味着重新执行这个中断函数?
2.我在电脑上的串口助手里不断向芯片串口发送123456789,但是每次芯片发回来的只有12,请解释原因。
3.如果说现在我需要从串口接收大量数据,并逐个处理这些数据,而处理每个字节的数据要花上很多时间,可能会影响到下个数据的接收,而现在又没有大量的RAM来存储这些数据,那么有什么好的解决办法?

好厉害!想学学!怎么学!

中断函数放延时函数会出大问题的(库函数的我不大熟悉),DMA可以看看,可以解决你的问题

有什么关系吗?是不是影响程序的执行效率,还是会跟别的中断出现冲突?

清除中断标志位!

首先,说明一件事,中断中不要延时。
嵌入式系统要保证中断短小精悍。
1,关于串口中断,你可以参考一下手册的SR寄存器第五位,关于接收中断的标志位清除方式。
如果标志位清除及时就可以申请下次中断。中断会再次进入这个函数。
2.你的程序的错误在于延时函数。这个函数会让中断函数卡死,,并且你这个程序每次输入一段数据,只会产生一次中断。
可是为什么会有两个数据发出呢?
是因为每产生一个中断其实单片机串口会接收两个数据,分别在接口移位寄存器,和DR寄存器中。所以你实际的一次中断,可以输出两个数据(1  2)的原因。
3.解决方式,目的~每次接收一个数据就要做处理。使用大一点的数组将所接收到的所有数据储存。然后写一个处理函数处理他们,然后再通过打印函数打印所有数组。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top