【问题标题】:Why does stm32f4 uart skip some characters when receiving using an interrupt为什么stm32f4 uart在使用中断接收时会跳过一些字符
【发布时间】:2018-06-11 18:22:13
【问题描述】:

尝试从串行 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);                             
}  

腻子会话:

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

asdfghjkl
a
s
g
k

【问题讨论】:

  • '等到传输完成' - 不是从 rx 中断处理程序调用时,不。这是一个非常糟糕的主意。
  • 'USART_Write(USARTx,&c);'......'while(*str)' - 不!单个字符不是以 NUL 结尾的字符数组!
  • 您使用中断从中断发送数据。这是个非常糟糕的主意。

标签: c interrupt stm32 stm32f4discovery


【解决方案1】:
USART_Write(USARTx,&c);
...........
while(*str)...
  • 不!单个字符不是以 NUL 结尾的字符数组!

您不能直接从 rx 中断处理程序使用轮询 tx 方法。这可能会导致 rx 溢出,因为 rx 缓冲区被新接收的字符覆盖,而 rx 中断处理程序被卡在轮询 tx 寄存器。

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

是的,我知道处理 tx 中断、循环缓冲区等有点痛苦。如果 tx 中断找不到更多要发送的字符,它必须在没有发送的情况下退出。这意味着当 rx 中断接下来需要排队 char 发送时,它必须将其加载到 tx 寄存器而不是队列中,以便“启动”tx 中断机制。

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

无论如何,无论如何,你不能使用这种混合的中断/轮询。它不会可靠地工作,额外的延迟会对其他中断产生不利影响,尤其是低优先级的中断,它们会长时间保持禁用状态:(

【讨论】:

  • 我明白了。那么,您将如何验证 rx 中断是否集成了 tx 中断方法?我必须使用 USART_WRITE() 来验证 rx 中断是否正常运行的唯一想法......
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2019-01-13
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多