最近学习到uart串口的部分。这里我用的是中断接收,将读取到的数据再发送出去。 void USART1_IRQHandler(void) { uint8_t receive_data = 0; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { receive_data = USART_ReceiveData(USART1); USART_SendData(USART1, receive_data); while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET); } } 我发现哪怕给芯片发送好几个字节的数据,芯片都能收到,而且原样的发送出来。 但是根据我学习的过程中发现的是,芯片一次接收的只有8位,一个字节。并且在调用 USART_ReceiveData()后会将RXNE这位清零。这应该表示在中断读取并发送一个字节的数据后就不会再进中断了。但是实际情况并不是这样。 经过思考我的想法是,在芯片接受完一个字节之后,的确退出了中断,但是由于接收的波特率较慢,所以在退出中断后,第二个字节的数据又发送了过来,这时又进入中断去读取和发送。 这个是我的想法不知道对不对?求解答 谢谢! |
1、读取串口数据后,未将串口接收中断标志位我清除掉
2、串口接收数据并发出去,但是接收到以后未关闭中断,后续新的数据会继续进入中断发送。只要中断正常,后面的数据是会继续发送的。
USART_IT_RXNE是接收非空的中断标记,也就是说,要等一个字节被完全接收才会产生这个中断,也就是每87us才会产生一次中断,87us够芯片跑很多很多语句了
但是用户手册中USART_SR寄存器的RXNE中的描述是写“对USART_DR的读操作可以将该位清零“。
中断如果不关闭的话,发送完毕后,再读数据当中还是有不少时间的,为什么任务完成了不退出呢?
也就是我的理解是差不多的? 这87us 程序就回到原来的地方执行,等到RXNE标志位被置位后,再进入中断? 所以这就是为什么要用DMA接收把?
不是,比如我发送01 02 03 给芯片,我想着一次中断只能发一个字节,所以应该只能发01,然后中断应该就退出了,实际发送了01 02 03 三个字节是不是表示进入了多次中断?
楼上朋友说的很对,因为速度快,多次进了中断