UART 如何在确保接收工同时进行大数据的连续传输?
有一个 uart的 应用需要连续发送大量数据。但是这个uart还需要接受配置信息。实际测试中,将接收用中断实现,在接受数据时,发送数据有丢包现象。
该如何优化串口收发呢?
串口是全双工的通讯外设接口,感觉上应该不会产生这个问题。
会不会是对端无法实现全双工,才导致的看上去“异常”了 本帖最后由 dukedz 于 2025-3-31 15:57 编辑
要定义一个数据帧(包),譬如 cdbus 格式
然后以数据帧(包)为单位进行收发
你收发是半双工还是全双工?
全双工的话,正确配置的情况下发送不会影响接收
譬如接收使用环形缓冲,不需要中断参与
如果接收需要中断参与,那么其它中断(譬如串口发送完成中断)可能会让串口接收的中断不能第一时间处理接收事务,导致丢数据
发送和接收同时进行,建议使用 DMA,让 UART 发送和接收都走 DMA,减少 CPU 负担。 你的接收是用中断的,那接收中断的处理函数里会不会占用太多时间,导致发送中断被影响? 试试用 FIFO(环形缓冲区) 处理 UART 接收,避免中断处理时间过长影响发送。 串口发送时可能会被接收中断打断,试试把 发送放到一个独立的 FreeRTOS 任务 里,降低竞争影响。 你的波特率是多少?如果太低,可能发送数据还没发完,新的数据就过来了,导致丢包。 STM32F4 的 UART 支持 双缓冲模式 DMA,你可以用 DMA 在后台自动收发,减少 CPU 介入。 你有尝试过 流控(RTS/CTS) 吗?硬件流控可以确保发送端不会超出接收端的处理能力。 发送数据时,可以 分块发送,先确认上一块数据传输完成后再继续,避免数据堆积导致丢包。 在发送数据时,试试看先 提高 UART 优先级,让发送中断比接收中断更优先执行。 你是在裸机环境下实现的吗?如果用了 FreeRTOS,考虑用 消息队列或信号量 控制发送逻辑,避免任务之间冲突。 接收缓冲区足够大,以防止数据溢出。可以使用循环缓冲区来管理接收到的数据。
页:
[1]