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

[复制链接]
 楼主| SocialButterfly 发表于 2025-3-31 08:30 | 显示全部楼层 |阅读模式
有一个 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 | 显示全部楼层
接收缓冲区足够大,以防止数据溢出。可以使用循环缓冲区来管理接收到的数据。
deliahouse887 发表于 2025-4-5 20:26 | 显示全部楼层
不同型号的 STM32 对 DMA 通道和缓冲区大小有限制,需参考芯片手册。
uiint 发表于 2025-4-5 22:01 | 显示全部楼层
对于大数据传输,使用 DMA              
yorkbarney 发表于 2025-4-6 07:37 | 显示全部楼层
使用DMA循环模式或中断+环形缓冲区管理数据。
juliestephen 发表于 2025-4-8 10:33 | 显示全部楼层
优先使用 DMA。              
timfordlare 发表于 2025-4-8 13:48 | 显示全部楼层
结合 DMA 和空闲中断。              
pixhw 发表于 2025-4-8 16:56 | 显示全部楼层
如果通信双方支持流控制,可以启用硬件流控制(如 RTS/CTS)或软件流控制(如 XON/XOFF),以确保数据的可靠传输。当接收缓冲区接近满时,发送流控制信号,暂停发送方的数据发送;当缓冲区有足够空间时,恢复数据发送。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

42

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部