硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3245|回复: 10
收起左侧

[技术讨论] STM32不定长串口DMA接收+简单AT命令实现

  [复制链接]

1

主题

2

回帖

10

积分

新手上路

积分
10
发表于 2023-10-31 13:53:29 | 显示全部楼层 |阅读模式
之前在论坛搜索过相关,感觉实现太麻烦了
分享自己写的代码,程序设计思路是一切以简化为主
只需要在CubeMX里面打开串口,然后打开串口DMA,和使能中断不要忘记了


实验效果:
下载 (7).png


代码结构:

下载 (8).png



说明:
void USART_Init(UART_HandleTypeDef *huart); //用于初始化DMA接收,例如在main.c里面USART_Init(&huart2);


void Printf(const char *fmt, ...);
void Printf_DMA(const char *fmt, ...); //区别在于一个不用DMA发送一个使用,用法和printf是一样的
static void Process_AT_command(char *command); //处理命令相关,在串口接收回调 函数里使用Process_AT_command(RxBuffer);


使用方法:
1.只需要在CubeMX里面配置好串口和DMA就行,
下载 (9).png
下载 (10).png
下载 (11).png
注意勾选生成外设.c/.文件
下载 (12).png

在你的main函数里初始化USART_Init(&huart2); //使用那个串口就填那个,前提是在cubemx里面配置好了
打开sys.c文件
下载 (13).png
这里面可以找到串口接收的回调函数,在这里做你需要的处理就好了







sys.c

4.66 KB, 下载次数: 59

sys.h

249 Bytes, 下载次数: 25

评分

参与人数 2金币 +120 收起 理由
KK-1 + 20
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1

主题

2

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-10-31 13:56:24 | 显示全部楼层
图片测试,,,,,,
1.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2023-10-31 16:46:32 | 显示全部楼层
非常感谢楼主分享。

ps:我们论坛的bug,得单独上传才行,已经帮楼主上传好。
回复

使用道具 举报

98

主题

356

回帖

650

积分

金牌会员

积分
650
发表于 2023-11-2 16:19:48 | 显示全部楼层
单纯依靠DMA+空闲中断的方式,如果对方发送的数据断断续续的时候(不是用的DMA发送),就会概率性出现丢数据的情况。
原因是你在打印或者处理数据期间,又收到了新的数据,但这里处理完数据就清空了缓存,所以后来收到的这些数据就丢失了。
弥补的方式是,进入空闲中断后,把一个计数器置位(比如10),然后每ms把这个数自减,直至减到0的时候,说明连续10ms已经没有新的数据了,就可以认为当前帧已经接收完毕。
这时候再处理数据,可以很大程度上弥补以上的问题,当然极端概率事件,比如就在10ms那个瞬间收到数据,这就是后话了。
回复

使用道具 举报

4

主题

186

回帖

198

积分

初级会员

积分
198
发表于 2023-11-3 14:59:17 | 显示全部楼层
有问题,直接DMA 循环接收就行了,不然每次还要重新打开接收。

不用DMA刻意这样搞
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-11-12 11:01:10 来自手机 | 显示全部楼层
串口接收用DMA循环方式,有新的数据丢FIFO中,都不用中断,也保证不丢数
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-7-22 18:10:22 | 显示全部楼层
tdh03z 发表于 2023-11-12 11:01
串口接收用DMA循环方式,有新的数据丢FIFO中,都不用中断,也保证不丢数

这个丢FIFO中 如果每次的数据长度都不一样要怎么处理?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-7-23 10:16:10 | 显示全部楼层
Y1ng 发表于 2024-7-22 18:10
这个丢FIFO中 如果每次的数据长度都不一样要怎么处理?

做不定长得借助空闲中断,否则不方便。
回复

使用道具 举报

32

主题

88

回帖

184

积分

初级会员

积分
184
发表于 2024-8-5 18:53:50 | 显示全部楼层
eric2013 发表于 2024-7-23 10:16
做不定长得借助空闲中断,否则不方便。

定时器做超时封包应该也能简单用一用吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-8-6 08:22:58 | 显示全部楼层
Y1ng 发表于 2024-8-5 18:53
定时器做超时封包应该也能简单用一用吧

对,也很方便,超时时间可以方便调节。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-3-31 20:37:39 | 显示全部楼层
云琴箫龙 发表于 2023-11-2 16:19
单纯依靠DMA+空闲中断的方式,如果对方发送的数据断断续续的时候(不是用的DMA发送),就会概率性出现丢数 ...

我就遇到这个问题了现在很苦恼怎么解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 21:53 , Processed in 0.381459 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表