打印

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

[复制链接]
楼主: caijie001
手机看帖
扫描二维码
随时随地手机跟帖
21
不错,好东西,,,,,,,,,,

使用特权

评论回复
22
877049204| | 2018-9-18 10:18 | 只看该作者
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这句不太明白
楼主这是项目需要,还是自己的爱好研究?

使用特权

评论回复
23
ayb_ice| | 2018-9-18 13:09 | 只看该作者
如果发送方,发送数据不连续怎么办呢

使用特权

评论回复
24
caijie001|  楼主 | 2018-9-18 20:56 | 只看该作者
ayb_ice 发表于 2018-9-18 13:09
如果发送方,发送数据不连续怎么办呢

那你普通接收也不是一样的吗?

使用特权

评论回复
25
caijie001|  楼主 | 2018-9-18 20:57 | 只看该作者
877049204 发表于 2018-9-18 10:18
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这 ...

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



使用特权

评论回复
26
caijie001|  楼主 | 2018-9-18 20:58 | 只看该作者
877049204 发表于 2018-9-18 10:18
顶一个,代码写的很规范,学习了
Usart_Rx_Sta是自己定义的吗?
Usart_Rx_Sta |= 0xC000;  //这 ...

这是我自己爱好,算是为了以后的项目需要吧

使用特权

评论回复
27
caijie001|  楼主 | 2018-9-18 20:58 | 只看该作者
lwp666 发表于 2018-9-18 10:04
不错,好东西,,,,,,,,,,

谢谢

使用特权

评论回复
28
caijie001|  楼主 | 2018-9-18 20:58 | 只看该作者
Luciferkeji 发表于 2018-9-18 09:02
再学习一遍,写的很详细。   之前遇到一个发一串ASCII码数据中间还会停顿一下的那种。也是不定长, 还好每 ...

谢谢支持

使用特权

评论回复
29
caijie001|  楼主 | 2018-9-18 20:59 | 只看该作者
icecut 发表于 2018-9-18 09:58
认真设计的太少...
不过串口现在地位是被鄙视的....随便搞搞就算过了

使用特权

评论回复
30
ayb_ice| | 2018-9-19 08:40 | 只看该作者
本帖最后由 ayb_ice 于 2018-9-19 08:43 编辑
caijie001 发表于 2018-9-18 20:56
那你普通接收也不是一样的吗?

普通接收当然不一样,我可以灵活设置超时
其实有个不错的方法,DMA只管往缓冲区接收就可以(如果溢出,重新往缓冲区接收),主循环通过判断接收了多少数据,然后取出分析,简单记录下总数,与出列指针就可以了

使用特权

评论回复
31
cos12a| | 2018-9-19 12:37 | 只看该作者
做到分层设计,同一层次互相切换,工程应用起来就方便多了。

使用特权

评论回复
32
caijie001|  楼主 | 2018-9-19 20:08 | 只看该作者
ayb_ice 发表于 2018-9-19 08:40
普通接收当然不一样,我可以灵活设置超时
其实有个不错的方法,DMA只管往缓冲区接收就可以(如果溢出,重 ...

f1的dma是没有FIFO的吧

使用特权

评论回复
33
caijie001|  楼主 | 2018-9-19 20:08 | 只看该作者
cos12a 发表于 2018-9-19 12:37
做到分层设计,同一层次互相切换,工程应用起来就方便多了。

是的

使用特权

评论回复
34
mohanwei| | 2018-9-19 21:22 | 只看该作者
拿常用的最高波特率115200bps来算:1bit是8.68us,常规8,n,1配置也就10bit,一个字节传输时间就是86.8us。用12MHz、12tick的51都能很轻松的处理串口中断,更不用说72MHz单周期的STM32F103……
中断方式的好处是代码随便移植。

使用特权

评论回复
35
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吗,了解一下

使用特权

评论回复
36
caijie001|  楼主 | 2018-9-19 23:13 | 只看该作者
mohanwei 发表于 2018-9-19 21:22
拿常用的最高波特率115200bps来算:1bit是8.68us,常规8,n,1配置也就10bit,一个字节传输时间就是86.8us ...

我没说中断不好,,但是你得考虑效率,外部反驳你说的,我也不发表任何关于不好的言论

使用特权

评论回复
37
mohanwei| | 2018-9-20 08:28 | 只看该作者
caijie001 发表于 2018-9-19 23:11
如果是很多个字节呢?如果用rtos呢,知道msp与psp吗,了解一下

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

使用特权

评论回复
38
ayb_ice| | 2018-9-20 08:41 | 只看该作者
caijie001 发表于 2018-9-19 20:08
f1的dma是没有FIFO的吧

具体不知道,可以软件实现

使用特权

评论回复
39
caijie001|  楼主 | 2018-9-20 09:49 | 只看该作者
ayb_ice 发表于 2018-9-20 08:41
具体不知道,可以软件实现

软件实现需要CPU的参与

使用特权

评论回复
40
caijie001|  楼主 | 2018-9-20 09:49 | 只看该作者
ayb_ice 发表于 2018-9-20 08:41
具体不知道,可以软件实现

软件实现需要CPU的参与

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则