HEnthusiast 发表于 2019-7-19 15:59:50

uart串口为什么能一次接收好几个字节的数据?

最近学习到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这位清零。这应该表示在中断读取并发送一个字节的数据后就不会再进中断了。但是实际情况并不是这样。
经过思考我的想法是,在芯片接受完一个字节之后,的确退出了中断,但是由于接收的波特率较慢,所以在退出中断后,第二个字节的数据又发送了过来,这时又进入中断去读取和发送。
这个是我的想法不知道对不对?求解答 谢谢!

发表于 2019-7-19 16:19:49

两个问题
1、读取串口数据后,未将串口接收中断标志位我清除掉
2、串口接收数据并发出去,但是接收到以后未关闭中断,后续新的数据会继续进入中断发送。只要中断正常,后面的数据是会继续发送的。

tgw860910 发表于 2019-7-19 16:23:21

串口发送一个字节,普遍是需要发送10个bit,用最常用的115200波特率来计算的话,10bit需要占用大约87us;
USART_IT_RXNE是接收非空的中断标记,也就是说,要等一个字节被完全接收才会产生这个中断,也就是每87us才会产生一次中断,87us够芯片跑很多很多语句了

HEnthusiast 发表于 2019-7-19 16:30:25

安 发表于 2019-7-19 16:19
两个问题
1、读取串口数据后,未将串口接收中断标志位我清除掉
2、串口接收数据并发出去,但是接收到以后未 ...

但是用户手册中USART_SR寄存器的RXNE中的描述是写“对USART_DR的读操作可以将该位清零“。
中断如果不关闭的话,发送完毕后,再读数据当中还是有不少时间的,为什么任务完成了不退出呢?

HEnthusiast 发表于 2019-7-19 16:32:02

tgw860910 发表于 2019-7-19 16:23
串口发送一个字节,普遍是需要发送10个bit,用最常用的115200波特率来计算的话,10bit需要占用大约87us;
U ...

也就是我的理解是差不多的?这87us 程序就回到原来的地方执行,等到RXNE标志位被置位后,再进入中断?所以这就是为什么要用DMA接收把?

发表于 2019-7-19 16:56:50

楼主你的意思描述不明确啊。比如你发送一个1,串口是回复了很多个1吗?

HEnthusiast 发表于 2019-7-19 17:13:22

安 发表于 2019-7-19 16:56
楼主你的意思描述不明确啊。比如你发送一个1,串口是回复了很多个1吗?

不是,比如我发送01 02 03 给芯片,我想着一次中断只能发一个字节,所以应该只能发01,然后中断应该就退出了,实际发送了01 02 03 三个字节是不是表示进入了多次中断?

freeworld-14222 发表于 2019-7-19 23:32:54

HEnthusiast 发表于 2019-7-19 17:13
不是,比如我发送01 02 03 给芯片,我想着一次中断只能发一个字节,所以应该只能发01,然后中断应该就退 ...

楼上朋友说的很对,因为速度快,多次进了中断

发表于 2019-7-20 09:00:26

数据多时会有丢失。但是也是会继续进入中断。除非收到以后就把中断关闭了。只要接收寄存器为空时,有新数据来了以后。接收中断继续工作。

Kevin201707 发表于 2019-7-20 11:37:00

因为CPU速度远快于UART
页: [1] 2
查看完整版本: uart串口为什么能一次接收好几个字节的数据?