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

Serialization PIC接收到UART被覆盖,读取速度不够快?,serialization,embedded,uart,pic,usart,Serialization,Embedded,Uart,Pic,Usart,我试图从MODBus主机读取一些串行数据,到目前为止,我已经设法让我的PIC使用MCC创建的功能接收数据,但是当主机发送太多数据时,我无法足够快地从UART中读取数据,以便为新数据输入腾出空间 我对这一点很陌生,我很确定我会回顾一些事情,有明显的答案,但我不知所措 目前,我的测试程序如下所示: printf("Initalised\r\n\n"); int Counter = 0; // Set RS485 to receive. RXMode(); whil

我试图从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
第一个字节是正确的,但是当它读取第二个字节时,它实际上正在读取发送的第十个字节,第三个字节正在读取发送的第十一个字节……等等


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

MCC生成的USART驱动程序代码将接收到的数据内部缓冲在8B(通常)环形缓冲区中;由
eusart1.c
中的
EUSART2\u RX\u BUFFER\u SIZE
定义。您发现,在应用程序循环可以使用
EUSART1\u read()
从缓冲区中读取数据之前,缓冲数据被覆盖

通常,在检测缓冲接收数据时,
EUSART1\u已准备就绪
,应通过重复
EUSART1\u读取
读取所有缓冲数据。由于每个字符读取之间都有跟踪打印,因此应用程序没有为处理入站数据提供太多带宽。这种方法不可扩展

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


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

对于接收到的每个字节,打印十几个字节左右。因此,该代码的最大可能持续读取速度小于其文本写入速度的十分之一。您确定系统的文本输出写入速度足够高吗?你测量过了吗?我按照下面的建议添加了一些更新,并将代码上传到GIT,特别是删除了输出的打印。通过增加缓冲区大小,最多发送16个字节的问题得到了解决,但在这之后,事情就变得不正常了。GIT项目还包括一个Log.txt,显示发送和接收的内容。非常感谢。我已经看了很多遍EUSARTx\u RX\u BUFFER\u大小!只是添加了痕迹指纹来帮助确定发生了什么。现在没问题了,我想这已经超出我的能力了。我将RX_BUFFER_大小设置为16,但是当发送大约25个字节时,仍然会覆盖数据。我预计总共会收到大约80个字节。我在EUSART1_is_rx_ready中设置了一个while循环,它读取EUSART1并将字节复制到一个rxData[I]数组中,其中有些东西似乎工作正常,但在EUSART1_读取之间我似乎需要一个延迟(大约5ms),否则它会有点疯狂,认为它收到了两次数据。我很困惑,tbh,我认为只要RX缓冲区中有东西,就将EUSART1_Read()放入一个循环将足够快,可以在下一个字节进入之前清除掉它,但显然不行。@DanTwining您是否能够共享仍有问题的更新代码?我已经将代码放在GIT上:我对GIT也是新手,但希望这是可见的。该代码与我的原始文章非常相似,但没有printf输出,并且在UART中有内容时,总是以循环方式将数据读入rxData[ByteNum]数组。