Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么stm32f4 uart在使用中断接收时跳过一些字符_C_Interrupt_Stm32_Stm32f4discovery - Fatal编程技术网

C 为什么stm32f4 uart在使用中断接收时跳过一些字符

C 为什么stm32f4 uart在使用中断接收时跳过一些字符,c,interrupt,stm32,stm32f4discovery,C,Interrupt,Stm32,Stm32f4discovery,尝试从串行Putty会话接收字符时遇到问题。当我在Putty中键入句子/多个字符以将字符发送到stm32f4微控制器时,它似乎不会使用中断方法接收所有字符 所以有两个问题: 不知道这里发生了什么。我错过什么了吗? 当为接收字符而调用中断时,我有点困惑。是为每个字符调用中断,还是用一次中断调用处理整个字符串? 代码: 油灰会议: 我在Putty中键入asdfghjkl,并使用USART_WRITE。。。作用 不单个字符不是以NUL结尾的字符数组! 您不能直接从rx中断处理程序使用轮询tx方法。当r

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

所以有两个问题:

不知道这里发生了什么。我错过什么了吗? 当为接收字符而调用中断时,我有点困惑。是为每个字符调用中断,还是用一次中断调用处理整个字符串? 代码:

油灰会议:

我在Putty中键入asdfghjkl,并使用USART_WRITE。。。作用

不单个字符不是以NUL结尾的字符数组! 您不能直接从rx中断处理程序使用轮询tx方法。当rx中断处理程序在轮询tx寄存器时被新接收的字符覆盖,这可能会导致rx溢出

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

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

如果char需要遍历等待的非中断线程和/或需要阻塞到协议单元中,那么事情就变得更加“有趣”


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

“等待传输完成”-从rx中断处理程序调用时不会。这是一个非常糟糕的主意。'USART_WriteUserTX,&c;'而“str”-不!单个字符不是以NUL结尾的字符数组!使用中断从中断发送数据。那是个很坏的主意,我明白了。然后,您将如何验证rx中断是否与tx中断方法一起工作?我唯一的想法是使用USART_WRITE来验证rx中断是否正常工作。。。
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
a
s
g
k
USART_Write(USARTx,&c);
...........
while(*str)...