UART通过RS485与PIC32通信产生的额外垃圾字节

UART通过RS485与PIC32通信产生的额外垃圾字节,c,microcontroller,uart,rs485,pic32,C,Microcontroller,Uart,Rs485,Pic32,到目前为止的工作: 通过USB转换器将PC中的字节发送到我的PIC32MX上的点击板RS485 UART5用于接收数据,这些数据通过UART4发送回终端读取 正在正确回显字节,但: 问题: PIC32接收到一些额外的垃圾字节,如“”或0x01(我的PIC32上已经调试过了吗) 当我在中断中使用printf回显数据时,接收到的额外字节会更少(但无论如何会有一些) 这是我的密码: void init() { SYSTEMConfig(SYS_FREQ, SYS_CFG_WAI

到目前为止的工作:

  • 通过USB转换器将PC中的字节发送到我的PIC32MX上的点击板RS485
  • UART5用于接收数据,这些数据通过UART4发送回终端读取
  • 正在正确回显字节,但:
问题:

  • PIC32接收到一些额外的垃圾字节,如“”或0x01(我的PIC32上已经调试过了吗)
  • 当我在中断中使用printf回显数据时,接收到的额外字节会更少(但无论如何会有一些)
这是我的密码:

void init() {
        SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

        /************************ UART5 for RS485 *********************************/
        UARTConfigure(UART_MODULE_ID, UART_ENABLE_PINS_TX_RX_ONLY);
        //UARTSetFifoMode(UART_MODULE_ID, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
        UARTSetFifoMode(UART_MODULE_ID, UART_INTERRUPT_ON_RX_NOT_EMPTY);
        UARTSetLineControl(UART_MODULE_ID, UART_DATA_SIZE_8_BITS | UART_PARITY_EVEN | UART_STOP_BITS_1);
        UARTSetDataRate(UART_MODULE_ID, GetPeripheralClock(), 19200);
        UARTEnable(UART_MODULE_ID, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

        // Configure UART RX Interrupt
        INTEnable(INT_SOURCE_UART_RX(UART_MODULE_ID), INT_ENABLED);
        INTSetVectorPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_PRIORITY_LEVEL_2);
        INTSetVectorSubPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_SUB_PRIORITY_LEVEL_0);

        /************************* UART4 - for debugging **************************/
        UARTConfigure(UART4, UART_ENABLE_PINS_TX_RX_ONLY);
        UARTSetLineControl(UART4, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
        UARTSetDataRate(UART4, GetPeripheralClock(), 19200);
        UARTEnable(UART4, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_TX));

        // Enable multi-vector interrupts
        INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
        INTEnableInterrupts();}

void __ISR(_UART_5_VECTOR, ipl2) IntUart5Handler(void) {
        volatile UINT state;
        unsigned char received;

        // Is this an RX interrupt?
        if (INTGetFlag(INT_SOURCE_UART_RX(UART_MODULE_ID))) {

            INTClearFlag(INT_SOURCE_UART_RX(UART_MODULE_ID));

            state = UARTGetLineStatus(UART_MODULE_ID);

            if (UART_DATA_READY & state > 0
                    && (state & (UART_OVERRUN_ERROR |
                    UART_PARITY_ERROR |
                    UART_FRAMING_ERROR |
                    UART_OVERRUN_ERROR)) == 0) { 
                received = UARTGetDataByte(UART_MODULE_ID);

                printf("%c", received);

            } 
        }

        // We don't care about TX interrupt
        if (INTGetFlag(INT_SOURCE_UART_TX(UART_MODULE_ID))) {
            INTClearFlag(INT_SOURCE_UART_TX(UART_MODULE_ID));
        }
    }

void _mon_putc(char c) {
            while (!UARTTransmitterIsReady(UART4));
            UARTSendDataByte(UART4, c);
            while (!UARTTransmissionHasCompleted(UART4));
        }
我没有像plib示例中那样放置PPS输出。这可能是个问题吗?我想这里的映射是不必要的,因为它采用标准引脚

我希望你能帮助我。我真的很沮丧,也很努力,但我就是不明白,为什么我会收到这些额外的字节


编辑:解决问题:

在此处找到解决方案:

事实是,你需要等待,直到数据可用!添加了以下行,它的工作非常完美

        while(!UARTReceivedDataIsAvailable(UART_MODULE_ID));
        received = UARTGetDataByte(UART_MODULE_ID);

注意:printf()在中断处理程序或信号处理程序中不安全。(主要是因为它可以调用malloc(),这不是异步安全的)。好的,谢谢您的提示!在这种情况下,printf正在调用_mon_putc。。。这不应该是个问题吗?通过直接调用重命名的_mon_putc来尝试,结果是一样的。这不一定是问题的根源,只是一个坏习惯,当你不期望它时,它会反过来咬你。顺便说一句:为什么不使用一个更大(不止一个)(循环)的缓冲区?首先全局分配它,这样就可以使用printfs()来监视外部代码中的状态。是的,以前是这样做的,我甚至得到了更多的垃圾字节。。。只是想摆脱他们,:-(