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