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.

TM4C123长期串口通信,出现问题?



485串口通信,上微机发送,TM4C123应答,发送和接收,都放在中断,
长期工作,一般2-3天会出现一次:发送中途停止的故障,没有进入发送中断
发送接收深度都是1个字节。程序中,还有定时器(5MS)中断,但485通信的串口已经设置最高优先级
不知道什么原因

  • 串口长期出问题是肯定的事情,所以需要加校验和modenbus协议

  • 是固定时间出现问题吗?确定一下是上位机还是MCU板出的问题吧。

    也可以把代码贴上来看看有没有逻辑上的问题。

  • 经过几天的跟踪,发现问题是进入接收超时中断,但问题是我默然的FIFO深度是一个字节,我串口监控也没发现多发字节
    01 03 00 B0 00 25 85 F6 (上微机发送)
    01 03 4A 00 E0 00 D1 00 00(MCU收到后应当发送,发送9个字节(9600)就是遇到接收超时中断,导致发送停止),我试着不去设接收超时中断//ROM_UARTIntEnable(UART2_BASE, UART_INT_RX);,一样会进入


    偶尔出现,什么原因导致接收超时中断
    接收超时中断能屏蔽掉吗?
    中断中是否执行
    buffer[rx_num]=ROM_UARTCharGetNonBlocking(UART2_BASE);
    就可以清接收超时中断

  • //UART2  RS485
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
              ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
              
              ROM_GPIOPinConfigure(GPIO_PG4_U2RX);
        ROM_GPIOPinConfigure(GPIO_PG5_U2TX);
        ROM_GPIOPinTypeUART(GPIO_PORTG_BASE, GPIO_PIN_4 | GPIO_PIN_5);
        
        baud_rate_init(EEBaudrate);
        ROM_UARTEnable(UART2_BASE);
        ROM_UARTFIFODisable(UART2_BASE);
        ROM_IntEnable(INT_UART2); //ê1ÄüUART2ÖD¶Ï
        ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);
        //ROM_UARTIntEnable(UART2_BASE, UART_INT_RX);
        ROM_UARTIntEnable(UART2_BASE, UART_INT_TX);
    /**********************************************************
                    RS485
    **********************************************************/
    void UART2_Handler(void)
    {
              uint32_t ui32Status;
            
        ui32Status = ROM_UARTIntStatus(UART2_BASE, true);
       
        ROM_UARTIntClear(UART2_BASE, ui32Status);
        if((ui32Status == UART_INT_RX) || (ui32Status == UART_INT_RT))   
      {
        while(ROM_UARTCharsAvail(UART2_BASE))
        {
           

        }
        } 
        
        if(ui32Status == UART_INT_TX)
        {
                Q1_Light_flag=0;
                if(SndFrmCnt[6]<uSndFrmCnt[6]) 
                 {
                          if(ROM_UARTSpaceAvail(UART2_BASE))
                           {
                                         ROM_UARTCharPutNonBlocking(UART2_BASE, tx_buf[SndFrmCnt[6]++]);
                     }
            }else  Snd_Complete_Flag[6]=1;                                   
        }
       
    }

  • 使用UART时先清空FIFO
    请问清除接收FIFO的指令是那个函数?

  • 问题应该找到, 发送完成,在打开接收!接收时,要关闭发送 ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT); ROM_UARTIntEnable(UART2_BASE, UART_INT_TX); ROM_UARTIntDisable(UART2_BASE, UART_INT_RX | UART_INT_RT); ROM_UARTIntDisable(UART2_BASE, UART_INT_TX); 我原来是只是没有发送关闭串口中断,工作是开串口中断 工作一个礼拜没出现问题