问题描述
我正在尝试从 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 内容。