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

时间:2018-01-02 00:13:31

标签: c interrupt stm32 stm32f4discovery

尝试从连续的Putty Session接收角色时遇到一些问题。当我在Putty中输入句子/多个字符以将字符发送到stm32f4微控制器时,它似乎没有使用中断方法接收所有字符。

所以有两个问题:

  1. 不确定这里发生了什么。我错过了什么吗?
  2. 当调用接收字符的中断时,我有点困惑。是为每个字符调用中断还是用一个中断调用处理整个字符串?
  3. 代码:

    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 Session:

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

    asdfghjkl
    a
    s
    g
    k
    

1 个答案:

答案 0 :(得分:1)

@ManagedBean(name="productController")
@SessionScoped
public class ProductController{


ProductModel pm = new ProductModel();
Product p= new Product();
public String createProduct(){

    pm.add(this.p);
    p = new Product();

    return "index.xhtml?faces-redirect=true";
}
  • NO!单个字符不是NUL终止的字符串数组!

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

您需要一个tx中断和某种缓冲区,例如。一个圆形的char队列。

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

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

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