繁体   English   中英

为什么使用中断接收时stm32f4 uart会跳过某些字符

[英]Why does stm32f4 uart skip some characters when receiving using an interrupt

尝试从串行Putty会话接收字符时遇到一些问题。 当我在Putty中键入句子/多个字符以将字符发送到stm32f4微控制器时,似乎没有使用中断方法接收所有字符。

有两个问题:

  1. 不知道这是怎么回事。 我想念什么吗?
  2. 当调用中断来接收字符时,我有些困惑。 是为每个字符调用了中断,还是只通过一个中断调用来处理整个字符串?

码:

void USART_Write(USART_TypeDef * USARTx, char * str)  {                         

  while(*str){                                                                  
    // First check if the Transmission Data register is empty                   
    while ( !(USARTx->SR & USART_SR_TXE)){};                                    

    // Write Data to the register which will then get shifted out               
    USARTx->DR =(*str &(uint16_t) 0x01FF);                                      

    str++;                                                                      
  }                                                                             
  // Wait until transmission is complete                                        
  while ( !(USARTx->SR & USART_SR_TC)){};                                       

}                              

void receive(USART_TypeDef * USARTx, volatile  char *buffer,
                volatile uint32_t * pCounter){

  if(USARTx->SR & USART_SR_RXNE){                                               
    char c = USARTx->DR;                                                        
    USART_Write(USARTx,&c);                                                     
    USART_Write(USARTx,"\n\r");                                                 
  }                                                                             



}                                                                               

void USART2_IRQHandler(void){                                                   
  receive(USART2, USART2_Buffer_Rx,&Rx2_Counter);                             
}  

油灰会议:

(我将asdfghjkl输入Putty,并使用USART_WRITE(...)函数打印出接收字符)

asdfghjkl
a
s
g
k
USART_Write(USARTx,&c);
...........
while(*str)...
  • 没有! 单个字符不是NUL终止的字符数组!

您不得直接通过rx中断处理程序使用轮询的tx方法。 当RX中断处理程序卡住轮询TX寄存器时,RX缓冲区将被新接收的字符覆盖,这有可能导致RX超限。

您需要一个TX中断和某种缓冲区,例如。 循环字符队列。

是的,我知道处理TX中断,循环缓冲区等有些麻烦。如果TX中断找不到更多要发送的字符,则必须退出而没有发送任何字符。 这意味着当下一个RX中断需要排队发送char时,它必须将其加载到tx寄存器而不是队列中,以便“启动” tx中断机制。

如果字符需要遍历等待的非中断线程和/或需要阻塞为协议单元,则事情变得更加“有趣”。

无论如何,您不得使用此混合中断/轮询。 它不会可靠地工作,并且额外的延迟会严重影响其他中断,尤其是优先级较低的中断,这些中断将长时间保持禁用状态:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM