微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试从 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 个字节,而第 3 个字节正在读取发送的第 11 个字节......等

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。