硬汉嵌入式论坛

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

[技术讨论] 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, 下载次数: 32

sys.h

249 Bytes, 下载次数: 16

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1

主题

2

回帖

10

积分

新手上路

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

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

使用道具 举报

4

主题

160

回帖

172

积分

初级会员

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

不用DMA刻意这样搞
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 07:05 , Processed in 0.184055 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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