[STM32G4] 串口不定长接收怎么做更好

[复制链接]
 楼主| 天灵灵地灵灵 发表于 2022-7-23 21:11 | 显示全部楼层 |阅读模式
我看HAL库函数接收和发送函数都是定场的接收,如何实现不定长发送和接收呢?
xinxianshi 发表于 2022-7-23 21:37 | 显示全部楼层
是不是需要用到超时中断。
sadicy 发表于 2022-7-24 09:48 | 显示全部楼层
最好还是确定好协议,定长接收
qq995423094 发表于 2022-7-24 10:29 | 显示全部楼层
开定时器做空闲监控,或者直接开串口接收空闲中断
SantaBunny 发表于 2023-2-23 20:50 | 显示全部楼层
使用中断的方式,使用自定义结束符
药无尘 发表于 2024-4-1 13:50 | 显示全部楼层
空闲中断加DMA
cemaj 发表于 2024-4-4 11:20 | 显示全部楼层
如果硬件支持,可以使用中断来处理串口接收。当串口接收到数据时,触发中断,然后在中断服务程序中处理接收到的数据。这种方法可以实时响应串口数据,但需要注意中断的优先级和嵌套问题。
eefas 发表于 2024-4-4 14:00 | 显示全部楼层
为了更好地处理不定长数据,可以使用环形缓冲区来存储接收到的数据。
jackcat 发表于 2024-4-4 18:25 | 显示全部楼层
中断方式是一种基于事件驱动的数据传输方式,可以在接收到数据时触发中断。使用中断接收不定长数据时,需要在中断处理程序中处理接收到的数据,并将其存储到内存中。
sesefadou 发表于 2024-4-4 21:02 | 显示全部楼层
如果条件允许,可以考虑使用多线程或多任务处理来同时处理串口接收和其他任务。这样可以避免因为等待串口数据而导致程序阻塞。
bestwell 发表于 2024-4-6 21:43 | 显示全部楼层
通过状态机来跟踪数据的接收过程,可以有效处理不同长度的数据帧。状态机可以根据接收到的字节数和预期的数据长度来判断当前的状态,从而做出相应的处理。
rosemoore 发表于 2024-4-7 20:32 | 显示全部楼层
DMA是一种硬件加速的数据传输方式,可以在不占用CPU资源的情况下将数据从串口接收到内存中。使用DMA接收不定长数据时,需要设置一个接收缓冲区,并在接收完成时通过DMA中断处理数据。
EmmaTT 发表于 2024-4-8 15:33 来自手机 | 显示全部楼层
用空闲中断就可以
mollylawrence 发表于 2024-4-8 19:59 | 显示全部楼层
当串口在一段时间内没有接收到新数据时,会触发空闲中断。可以利用这个特性来判断数据是否接收完毕。在STM32中,可以通过使能IDLE中断来实现这一功能。
benjaminka 发表于 2024-4-9 12:30 | 显示全部楼层
在设计通信协议时,可以考虑在数据帧的头部或尾部添加长度信息。这样,接收方就可以根据长度信息来确定每帧数据的长度,从而准确地分割出每个数据帧。
lzbf 发表于 2024-4-9 20:51 | 显示全部楼层
如果数据传输中存在乱序或重叠,可能需要一个同步机制来确保数据包的顺序和完整性。例如,可以使用序列号或时间戳。
janewood 发表于 2024-4-10 12:39 | 显示全部楼层
在数据包中包含一个长度字段,这样接收端可以在读取数据之前先知道数据包的长度。长度字段可以是固定长度的,也可以是可变长度的,但最好是事先定义好。
mikewalpole 发表于 2024-4-12 01:39 | 显示全部楼层
在中断处理函数中,可以检查接收到的数据包的长度。如果数据包长度超过预期的最大长度,可以丢弃该数据包或采取其他措施。
loutin 发表于 2024-4-12 07:32 | 显示全部楼层
利用串口接收中断,当接收到一个数据时触发中断。同时,设置一个计时器,如果在预定的时间内没有接收到新的数据,则认为数据接收完毕。这种方法可以减少CPU资源的浪费,但需要合理设置超时时间以适应不同的通信情况。
updownq 发表于 2024-4-12 11:07 | 显示全部楼层
为串口接收数据分配一个足够大的缓冲区,以便一次性接收更多的数据。这样,即使数据长度未知,也可以保证大部分数据能够被完整接收。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

182

主题

3469

帖子

13

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