串口UART问答合集
由本目录 9 篇串口主题问答的答案精华按知识点重组而成,原帖全部保留,每节末尾标注出处。
1. 没有空闲中断怎么断帧:DMA 剩余计数 + 时间
串口 DMA 接收,不用 IDLE 中断时:自己查询 DMA 剩余传输长度,结合时间来断帧。很多没有串口空闲中断的单片机都是这样做的;这样做还有一个目的——节省中断资源。
— 串口dma接收,不用idle的话,可以自己查询dma剩余传输长度结合时间来断帧(Jack)
2. 为什么解析不放在"前端"线程
串口接收不定长架构中,不在前端线程解析数据,是因为数据解析可能耗时过长,不能及时响应中断——前端的职责是尽快把数据收下来,解析放到后端去做。
— 看完串口相关视频我是这么理解的:串口接收不定长架构(Jack)
3. 串口 DMA + 环形缓冲的收发包结构
串口 DMA 加环形缓冲区主要用于传输数据;自定义协议帧的包结构为:包头识别符、包长度、净荷数据、包尾识别符。
- 发送:数据放到一个定长 buffer 后,启动串口 DMA 发送函数发出;
- 接收:串口 + 环形缓冲区,用于实时接收命令。
— 老师,我们的串口dma加环形缓冲区主要是用于传输数据(Jack)
4. 疑难杂症:发送时最后一个字节先发出来
使用 ST 提供的串口发送函数出现"最后一个字节先发出来"的现象,星主的判断是:你的环形缓冲区上一包数据还没发完(发送时序被上一包残留占用)。
— 我猜测,因为你的环形缓冲区没有(Jack)
5. USB 口可以当串口用吗
可以。USB 可以枚举成串口(CDC),但这种串口需要系统完整跑起来,否则可能枚举不成功;枚举失败时电脑端不会出现 COM 口。
— 我想问一下,单片机的USB口,可以当串口使用吗?我之前USB口是用串口,用来调试(Jack)
6. 参考工程资源
B 站视频配套的"串口单字节不定长双 buffer 的 DMA 和 CPU 并行工作 Demo"完整工程(附件 zip)。
— B站视频中的串口单字节不定长双buffer的DMA和CPU并行工作Demo(Jack)
7. 更多相关问答(答案在原帖截图中)
- 单片机的串口本身没有空闲中断怎(Jack)——无空闲中断单片机的替代断帧方案图解
- 一读多写串口策略模式(Jack)——一个读端多个写端的串口策略模式设计图
- 软件架构层面来说: ADC:(Jack)——串口/ADC 通用的前后端 + 双缓冲 + 解包架构总纲,详见 ADC采样问答合集
来源笔记
- 串口dma接收,不用idle的话,可以自己查询dma剩余传输长度结合时间来断帧(Jack)
- 看完串口相关视频我是这么理解的:串口接收不定长架构(Jack)
- 老师,我们的串口dma加环形缓冲区主要是用于传输数据(Jack)
- 我猜测,因为你的环形缓冲区没有(Jack)
- 我想问一下,单片机的USB口,可以当串口使用吗?我之前USB口是用串口,用来调试(Jack)
- B站视频中的串口单字节不定长双buffer的DMA和CPU并行工作Demo(Jack)
- 单片机的串口本身没有空闲中断怎(Jack)
- 一读多写串口策略模式(Jack)
- 软件架构层面来说: ADC:(Jack)