STM32之串口DMA接收不定长数据

[复制链接]
10491|50
lwp666 发表于 2018-9-18 10:04 | 显示全部楼层
不错,好东西,,,,,,,,,,
877049204 发表于 2018-9-18 10:18 | 显示全部楼层
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这句不太明白
楼主这是项目需要,还是自己的爱好研究?
ayb_ice 发表于 2018-9-18 13:09 | 显示全部楼层
如果发送方,发送数据不连续怎么办呢
 楼主| caijie001 发表于 2018-9-18 20:56 | 显示全部楼层
ayb_ice 发表于 2018-9-18 13:09
如果发送方,发送数据不连续怎么办呢

那你普通接收也不是一样的吗?
 楼主| caijie001 发表于 2018-9-18 20:57 | 显示全部楼层
877049204 发表于 2018-9-18 10:18
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这 ...

Usart_Rx_Sta是自己定义的,,它的作用如下:
  1. /**                    Usart_Rx_Sta
  2.         * ----------------------------------------------------------
  3.         * | 1  1  0  0 | 0  0  0  0 | 0  0  0  0 | 0  0  0  0|
  4.         * -----------------------------------------------------------
  5.   * 最高两位用于保存数据是否接收完成   0:未完成 1:完成
  6.   * 次高位用于保存是否收到数据帧头     0:未完成 1:完成
  7.   * 其他位用于保存数据包长度,数据包最大长度为(255)个字节
  8. */
  9. /* 接收状态标记 */
  10. uint16_t Usart_Rx_Sta = 0;  



 楼主| caijie001 发表于 2018-9-18 20:58 | 显示全部楼层
877049204 发表于 2018-9-18 10:18
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这 ...

这是我自己爱好,算是为了以后的项目需要吧
 楼主| caijie001 发表于 2018-9-18 20:58 | 显示全部楼层
lwp666 发表于 2018-9-18 10:04
不错,好东西,,,,,,,,,,

谢谢
 楼主| caijie001 发表于 2018-9-18 20:58 | 显示全部楼层
Luciferkeji 发表于 2018-9-18 09:02
再学习一遍,写的很详细。   之前遇到一个发一串ASCII码数据中间还会停顿一下的那种。也是不定长, 还好每 ...

谢谢支持
 楼主| caijie001 发表于 2018-9-18 20:59 | 显示全部楼层
icecut 发表于 2018-9-18 09:58
认真设计的太少...
不过串口现在地位是被鄙视的....随便搞搞就算过了

ayb_ice 发表于 2018-9-19 08:40 | 显示全部楼层
本帖最后由 ayb_ice 于 2018-9-19 08:43 编辑
caijie001 发表于 2018-9-18 20:56
那你普通接收也不是一样的吗?

普通接收当然不一样,我可以灵活设置超时
其实有个不错的方法,DMA只管往缓冲区接收就可以(如果溢出,重新往缓冲区接收),主循环通过判断接收了多少数据,然后取出分析,简单记录下总数,与出列指针就可以了
cos12a 发表于 2018-9-19 12:37 | 显示全部楼层
做到分层设计,同一层次互相切换,工程应用起来就方便多了。
 楼主| caijie001 发表于 2018-9-19 20:08 | 显示全部楼层
ayb_ice 发表于 2018-9-19 08:40
普通接收当然不一样,我可以灵活设置超时
其实有个不错的方法,DMA只管往缓冲区接收就可以(如果溢出,重 ...

f1的dma是没有FIFO的吧
 楼主| caijie001 发表于 2018-9-19 20:08 | 显示全部楼层
cos12a 发表于 2018-9-19 12:37
做到分层设计,同一层次互相切换,工程应用起来就方便多了。

是的
mohanwei 发表于 2018-9-19 21:22 | 显示全部楼层
拿常用的最高波特率115200bps来算:1bit是8.68us,常规8,n,1配置也就10bit,一个字节传输时间就是86.8us。用12MHz、12tick的51都能很轻松的处理串口中断,更不用说72MHz单周期的STM32F103……
中断方式的好处是代码随便移植。
 楼主| caijie001 发表于 2018-9-19 23:11 | 显示全部楼层
mohanwei 发表于 2018-9-19 21:22
拿常用的最高波特率115200bps来算:1bit是8.68us,常规8,n,1配置也就10bit,一个字节传输时间就是86.8us ...

如果是很多个字节呢?如果用rtos呢,知道msp与psp吗,了解一下
 楼主| caijie001 发表于 2018-9-19 23:13 | 显示全部楼层
mohanwei 发表于 2018-9-19 21:22
拿常用的最高波特率115200bps来算:1bit是8.68us,常规8,n,1配置也就10bit,一个字节传输时间就是86.8us ...

我没说中断不好,,但是你得考虑效率,外部反驳你说的,我也不发表任何关于不好的言论
mohanwei 发表于 2018-9-20 08:28 | 显示全部楼层
caijie001 发表于 2018-9-19 23:11
如果是很多个字节呢?如果用rtos呢,知道msp与psp吗,了解一下

再多字节跟处理能力都没有关系,收到1字节产生中断后,需要等86.8us才会产生下一个中断;在此期间串口中断程序即使加上队列缓冲也就最多2us左右就完成了。
我们用freertos做串口服务器,逻辑分析仪观测串口可实现全速收发,而代码一点技巧优化都没有。串口这种慢速设备不会是系统的瓶颈
ayb_ice 发表于 2018-9-20 08:41 | 显示全部楼层
caijie001 发表于 2018-9-19 20:08
f1的dma是没有FIFO的吧

具体不知道,可以软件实现
 楼主| caijie001 发表于 2018-9-20 09:49 | 显示全部楼层
ayb_ice 发表于 2018-9-20 08:41
具体不知道,可以软件实现

软件实现需要CPU的参与
 楼主| caijie001 发表于 2018-9-20 09:49 | 显示全部楼层
ayb_ice 发表于 2018-9-20 08:41
具体不知道,可以软件实现

软件实现需要CPU的参与
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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