乐鑫技术交流
直播中

小麦地

11年用户 1542经验值
私信 关注
[问答]

串口高频接收数据的疑问求解

请教各位一个问题
串口1波特率为921600,以10hz的频率接收数据,每次接受的数据有两条,第一条数据是147字节,以n结尾,第二条是205字节,以n结尾,这两条是连续的,
检测设置如下
uart_enable_pattern_det_baud_intr(uart_port, 'n', 1, 9, 0, 0);
代码中Pattern Queue Size是20,
RING_BUFFER_SIZE是2048,
但是一直显示以下warning,会丢失数据Code: Select all
W (8464) uart1: Ring Buffer FullW (8514) uart1: Pattern Queue Size too smallW (8614) uart1: pos:83W (8714) uart1: pos:147W (8814) uart1: pos:205W (8914) uart1: pos:147W (9014) uart1: pos:205W (9114) uart1: pos:147W (9214) uart1: pos:205W (9314) uart1: pos:147W (9414) uart1: pos:205W (9514) uart1: pos:147W (9614) uart1: pos:205W (9714) uart1: pos:147W (9814) uart1: pos:205W (9914) uart1: pos:147W (10014) uart1: pos:205W (10114) uart1: pos:147W (10214) uart1: pos:205W (10264) uart1: Ring Buffer FullW (10314) uart1: Pattern Queue Size too small

回帖(2)

张海燕

2024-6-12 09:44:11
 官方的串口例程并不好用,用的是队列在空闲的时候接收,即使不运行其他历程只接收在队列满了后释放队列过程中有数据来了就会丢了。有两种方法,1.每次传少于队列长度的数据,然后发送端等待一会再继续发。2.不要使用队列方式,也就是不要用uart_driver_install,然后和你写单片机驱动一样去写串口驱动。串口有缓冲区,最大可以设置1024字节,多快都不会丢数据。所有芯片官方例程只是参考,只会套例程不会写出高效率程序~
举报

王璐

2024-6-12 17:18:54
从您提供的信息来看,您在使用串口通信时遇到了数据丢失的问题。这可能是由于以下几个原因导致的:

1. **Ring Buffer Size**:您的RING_BUFFER_SIZE设置为2048字节,但是每次接收的数据总共为352字节(147字节 + 205字节)。如果数据接收频率较高,可能会导致缓冲区溢出。您可以尝试增加RING_BUFFER_SIZE的值,以确保有足够的空间存储接收到的数据。

2. **Pattern Queue Size**:您的Pattern Queue Size设置为20,这意味着模式检测队列只能存储20个模式。如果数据接收频率较高,队列可能会被填满,导致新的数据无法被检测。您可以尝试增加Pattern Queue Size的值,以确保模式检测队列有足够的空间存储模式。

3. **波特率和频率**:您的波特率为921600,接收频率为10Hz。这意味着每秒钟需要接收10组数据,每组数据为352字节。在这种情况下,您需要确保硬件和软件都能够处理这种高速率的数据接收。如果处理速度跟不上,可能会导致数据丢失。

4. **中断处理**:请检查您的中断处理函数是否能够及时处理接收到的数据。如果中断处理函数执行时间过长,可能会导致数据接收不及时,从而引发数据丢失。

为了解决这个问题,您可以尝试以下方法:

1. 增加RING_BUFFER_SIZE和Pattern Queue Size的值,以确保有足够的空间存储接收到的数据和模式。

2. 优化中断处理函数,确保其能够快速处理接收到的数据。

3. 如果可能的话,降低波特率或接收频率,以减轻硬件和软件的负担。

4. 检查硬件连接和配置,确保没有其他问题导致数据丢失。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分