关于STM32串口接收中断,网上有如下中断方式接收数据的程序:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32串口接收中断,网上有如下中断方式接收数据的程序:相关的知识,希望对你有一定的参考价值。

void USART1_IRQHandler(void) //串口1中断

char RX_dat; //定义字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断

USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01); //开始传输
RX_dat=USART_ReceiveData(USART1) & 0x7F; //接收数据,整理除去前两位

//**************使用RX_dat进行一些处理操作,这里省略了较复杂的处理过程....********

USART_SendData(USART1, RX_dat); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
//等待发送结束


问题一:上面的注释部分,“接收数据,整理除去前两位”应该是“接收数据,整理除去前一位”吧?
问题二:当执行“RX_dat=USART_ReceiveData(USART1) & 0x7F;"后,RXNE标志应该成为了RESET”状态,即接收数据寄存器变为“空”状态,那么这时后续数据就会由移位寄存器转到接收数据寄存器,转换完成后RXNE被SET,这时候又会进入中断处理函数。如果在中断处理函数中读取数据后要对数据进行处理的时间较长,那么后续数据的进入会打断前一数据的处理过程,所以达不到接收一个字节数据,然后处理完,再接收一个字节数据,然后再处理完的这样的整个的过程。也就是说上面程序中的将接收到的数据输出的过程可能会被由于后续数据的进入而引发的中断而中断。不知道我说的这个对不对?
问题三:如果问题二中我说的过程不正确,即后续数据的接收不会打断前面数据的中断处理过程,那么是因为调用了“USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志”?难道清除中断标志位可以让RXNE只有在退出中断处理函数的时候才可以被SET?
问题四:用中断方式接收数据,中断处理函数的编写是否是如下规律?1、禁能中断。2、清除中断标志位,使得中断标志位可以准确的反映后续的中断状态。3、接收数据,并进行数据处理。4、使能中断。

参考技术A 前三个问题,你实验一下不就知道了,问题4:中断服务函数编写规律,这个,谈不上规律吧,每次接收完,一定要清除标志位,最好是在接收时,关闭使能发送,发送时失能接收,要不容易出现问题。 参考技术B 1,程序字面应该是清除1位
2,涉及中断嵌套问题,自己的中断等级不会比自己高吧,所以应该不会处理不完本中断进下一个中断,除非是更高优先级的中断来了。在这种情况下,如果下一个数据来了,中断没处理完,又来了数据,可能的情况是数据丢失。
3,不是
4,一般情况下,是将你的1,和4去掉,加着也挺好(个人觉得)

以上是关于关于STM32串口接收中断,网上有如下中断方式接收数据的程序:的主要内容,如果未能解决你的问题,请参考以下文章

stm32啥触发串口接收中断

关于STM32串口调试RS485时自动进入接收中断

STM32中串口中断接收异常

STM32串口 不用中断方式 接收一个字符串...怎么解决?

STM32 | 串口空闲中断接收不定长数据(DMA方式)

stm32 开启接收中断 PC 发送两次 为啥串口只接收到一次