PIC 接收 UART 被覆盖,读取速度不够快?

PIC Receive UART Overwritten, not reading out fast enough?

我正在尝试从 MODBus 主机读取一些串行数据,到目前为止已经设法让我的 PIC 使用从 MCC 创建的函数接收数据,但是当主机发送太多数据时我不能以足够快的速度从 UART 中读出它,以便为传入的新数据腾出空间。

我对此很陌生,我很确定我正在研究那些有明显答案的东西,但我不知所措。

目前我的测试程序是这样的:

printf("Initalised\r\n\n");

int Counter = 0;
 
// Set RS485 to receive.
RXMode();
    
while(1)
{
    if(EUSART1_is_rx_ready()){
        Counter++;           

        printf("Triggered: %i \r\n\n", Counter);

        while(EUSART1_is_rx_ready()){
                // While there's something to read out
                rxData = EUSART1_Read();
                printf("eusart1RxCount: %d \r\nData: 0x%02x \r\n\n", eusart1RxCount, rxData);                
        }

    }

}

发送:0x11 0x10 0x00 0x01 0x00 0x02 0x04 0x00 0x0A 0x01 0x02 0xC6 0xF0 产生以下输出:

Initalised

Triggered: 1

eusart1RxCount: 5
Data: 0x11

eusart1RxCount: 11
Data: 0x01

eusart1RxCount: 10
Data: 0x02

eusart1RxCount: 9
Data: 0xc6

eusart1RxCount: 8
Data: 0xf0

eusart1RxCount: 7
Data: 0x02

eusart1RxCount: 6
Data: 0x04

eusart1RxCount: 5
Data: 0x00

eusart1RxCount: 4
Data: 0x0a

eusart1RxCount: 3
Data: 0x01

eusart1RxCount: 2
Data: 0x02

eusart1RxCount: 1
Data: 0xc6

eusart1RxCount: 0
Data: 0xf0

第一个字节是正确的,但是当它读取第二个字节时,它实际上读取的是发送的第 10 个字节,而第三个字节读取的是发送的第 11 个字节……等等

希望有人能帮忙!我在这上面花了一整天。非常感谢任何建议,我觉得我在这里的学习曲线很陡峭。

MCC 生成的 USART 驱动程序代码在内部缓冲 8B(通常)环形缓冲区中的接收数据;由 eusart1.c 中的 EUSART2_RX_BUFFER_SIZE 定义。您发现缓冲数据正在被覆盖,在应用程序循环可以使用 EUSART1_Read().

从缓冲区中读取它之前

通常,在检测缓冲的 RX 数据时,EUSART1_is_rx_ready,您应该通过重复 EUSART1_Read 来读取 所有 缓冲的数据。由于每个字符读取之间的所有跟踪打印,应用程序没有提供太多带宽来处理入站数据。此方法不可扩展。

如果需要跟踪打印,则应增加 USART RX 缓冲区大小,以避免在处理数据之前环形缓冲区回绕。这可以通过更改 EUSART2_RX_BUFFER_SIZE.

的值来完成

最好一次性将所有缓冲数据读取到本地缓冲区,然后对其进行处理,例如打印出本地缓冲的 USART RX 内容。