STM32串口接收中断问题

2019-07-14 21:09发布

  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来存储这些数据,那么有什么好的解决办法?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
anazel
1楼-- · 2019-07-15 10:55
小申xiao 发表于 2016-3-15 01:09
中断函数放延时函数会出大问题的(库函数的我不大熟悉),DMA可以看看,可以解决你的问题

有什么关系吗?是不是影响程序的执行效率,还是会跟别的中断出现冲突?
段鑫123
2楼-- · 2019-07-15 10:57
 精彩回答 2  元偷偷看……
小申xiao
3楼-- · 2019-07-15 15:22
首先,说明一件事,中断中不要延时。
嵌入式系统要保证中断短小精悍。

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

一周热门 更多>