This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PZ 在使用UARTCharGet函数的问题

TI的工程师们 请教下

 UARTCharGet函数循环接收时第一次没有阻塞,

if(flag==1)
 { 

   UART1_RX_data[0]=UARTCharGet(UART1_BASE);
  SysCtlDelay(50000);
  
  
  UARTCharPut(UART1_BASE,UART1_RX_data[0]);
  SysCtlDelay(50000);
}
第一次没有阻塞 ,串口调试软件直接显示00  ,后面每次都有阻塞,串口调试软件显示的是发送的数据
  • //*****************************************************************************

    //
    //! Waits for a character from the specified port.
    //!
    //! \param ui32Base is the base address of the UART port.
    //!
    //! This function gets a character from the receive FIFO for the specified
    //! port. If there are no characters available, this function waits until a
    //! character is received before returning.
    //!
    //! \return Returns the character read from the specified port, cast as a
    //! \e int32_t.
    //
    //*****************************************************************************
    int32_t
    UARTCharGet(uint32_t ui32Base)
    {
    //
    // Check the arguments.
    //
    ASSERT(_UARTBaseValid(ui32Base));

    //
    // Wait until a char is available.
    //
    while(HWREG(ui32Base + UART_O_FR) & UART_FR_RXFE)
    {
    }

    //
    // Now get the char.
    //
    return(HWREG(ui32Base + UART_O_DR));
    }

    注意标注红色部分,其可能没有获取字符,停留在此等待。

  • 在规定的时间内,没有收到数据,就会阻塞,这属于你程序的问题。建议你用接收中断,判断接收到字符,然后发送出去。或者循环判断接收到字符后才发送。

  • 用了接收中断 但是每次上电只能进一次中断,后面发数据就进不去了

    void UART1IntHandler(void)
     {
     
      unsigned char Temp[8],i;
     uint32_t ui32Status;
     GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,GPIO_PIN_0);
     
     ui32Status = UARTIntStatus(UART1_BASE, true);
     UARTIntClear(UART1_BASE, ui32Status);
     
     
      while(!UARTCharsAvail(UART1_BASE))
      GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,0);//485接收使能
      for(i=0;i<8;i++)
      {
     
      Temp[i]= UARTCharGet(UART1_BASE);
     
     }
     
       while(!UARTCharsAvail(UART1_BASE))
      GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,GPIO_PIN_1);//485发送使能
     for(i=0;i<8;i++)
      {
     
      UARTCharPut(UART1_BASE,Temp[i]);
       }
     
     
       GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,0);
     }
  • 直接用串口可以了 ,后来改成用485和中断接收的模式 每次上点只能进一次中断

    用了接收中断 但是每次上电只能进一次中断,后面发数据就进不去了

    void UART1IntHandler(void)
     {
     
      unsigned char Temp[8],i;
     uint32_t ui32Status;
     GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,GPIO_PIN_0);
     
     ui32Status = UARTIntStatus(UART1_BASE, true);
     UARTIntClear(UART1_BASE, ui32Status);
     
     
      while(!UARTCharsAvail(UART1_BASE))
      GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,0);//485接收使能
      for(i=0;i<8;i++)
      {
     
      Temp[i]= UARTCharGet(UART1_BASE);
     
     }
     
       while(!UARTCharsAvail(UART1_BASE))
      GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,GPIO_PIN_1);//485发送使能
     for(i=0;i<8;i++)
      {
     
      UARTCharPut(UART1_BASE,Temp[i]);
       }
     
     
       GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,0);
     }
  • 中断标志的清除应该放在最后面,还有,中断程序尽量精简。不要加while之类的判断,很可能死掉。

  • 你好 !  

      再请教你一个问题,TM4C123 为什么串口软件一次发8位数据的时候,才能收到串口传回的正确数据,不足8位的时候只能接收到部分数据

     已将FIFO disable 了

  • 串口只能一次发送8位数据,一个字节就是8位的,你如何传少于8位的数据呢,不可能的吧?

  • 不好意思 ,我说的是要一次发送16 字节 少于16字节时要发两次才能触发接收中断

  • 你把FIFO的深度改成8位试试,现在应该是16位,所以发送两次才会触发中断了。