SocialButterfly 发表于 2025-3-31 08:30

UART 如何在确保接收工同时进行大数据的连续传输?

有一个 uart的 应用需要连续发送大量数据。但是这个uart还需要接受配置信息。
实际测试中,将接收用中断实现,在接受数据时,发送数据有丢包现象。
该如何优化串口收发呢?

jobszheng 发表于 2025-3-31 09:51

串口是全双工的通讯外设接口,感觉上应该不会产生这个问题。
会不会是对端无法实现全双工,才导致的看上去“异常”了

dukedz 发表于 2025-3-31 15:54

本帖最后由 dukedz 于 2025-3-31 15:57 编辑

要定义一个数据帧(包),譬如 cdbus 格式
然后以数据帧(包)为单位进行收发
你收发是半双工还是全双工?
全双工的话,正确配置的情况下发送不会影响接收

譬如接收使用环形缓冲,不需要中断参与

如果接收需要中断参与,那么其它中断(譬如串口发送完成中断)可能会让串口接收的中断不能第一时间处理接收事务,导致丢数据

公羊子丹 发表于 2025-4-2 07:44

发送和接收同时进行,建议使用 DMA,让 UART 发送和接收都走 DMA,减少 CPU 负担。

周半梅 发表于 2025-4-2 07:45

你的接收是用中断的,那接收中断的处理函数里会不会占用太多时间,导致发送中断被影响?

帛灿灿 发表于 2025-4-2 07:46

试试用 FIFO(环形缓冲区) 处理 UART 接收,避免中断处理时间过长影响发送。

童雨竹 发表于 2025-4-2 07:47

串口发送时可能会被接收中断打断,试试把 发送放到一个独立的 FreeRTOS 任务 里,降低竞争影响。

万图 发表于 2025-4-2 07:48

你的波特率是多少?如果太低,可能发送数据还没发完,新的数据就过来了,导致丢包。

Wordsworth 发表于 2025-4-2 07:49

STM32F4 的 UART 支持 双缓冲模式 DMA,你可以用 DMA 在后台自动收发,减少 CPU 介入。

Bblythe 发表于 2025-4-2 07:50

你有尝试过 流控(RTS/CTS) 吗?硬件流控可以确保发送端不会超出接收端的处理能力。

Pulitzer 发表于 2025-4-2 07:51

发送数据时,可以 分块发送,先确认上一块数据传输完成后再继续,避免数据堆积导致丢包。

Uriah 发表于 2025-4-2 07:52

在发送数据时,试试看先 提高 UART 优先级,让发送中断比接收中断更优先执行。

Clyde011 发表于 2025-4-2 07:53

你是在裸机环境下实现的吗?如果用了 FreeRTOS,考虑用 消息队列或信号量 控制发送逻辑,避免任务之间冲突。

tifmill 发表于 2025-4-4 17:22

接收缓冲区足够大,以防止数据溢出。可以使用循环缓冲区来管理接收到的数据。
页: [1]
查看完整版本: UART 如何在确保接收工同时进行大数据的连续传输?