簡體   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