搜索
查看: 8369|回复: 16

[原创] 基于DMA循环接收的串口不定长数据处理方案

[复制链接]

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
发表于 2017-9-20 15:37:00 | 显示全部楼层 |阅读模式
当DMA配置成循环接收后,DMA会自动将来自串口的数据循环写到设定的缓冲区中。通过定时查询缓冲区来取出数据。
对于不定长数据可以通过检查包头和包长度判断是否接收一包完整数据。
该方案不需要使用空闲中断。不会丢失数据。
如果偶尔数据被覆盖,可以尝试扩大缓冲区。如果经常有数据被覆盖,要么是系统设计不合理。要么是处理器性能不足。
一下使用stm32L476 nucleo-64板
下面是串口配置
uartConfig.jpg

DMA的配置
uartDmaConfig.jpg
中断配置:为了使用发送完成回调,需要使能串口中断。
uartNvicConfig.jpg

CubeMX的详细使用方法参见论坛中的入门贴。我就不多废话了。

核心代码:用于从环形缓冲区中提取数据。
  1. uint32_t ringBufPop(uint8_t *buf,uint32_t len,struct ringBufHandlerType *hringBuf,DMA_HandleTypeDef *hdma)
  2. {
  3.         uint32_t retval;
  4.         //计算数据量
  5.         retval=hringBuf->bufSize - __HAL_DMA_GET_COUNTER(hdma);
  6.         if(retval<hringBuf->dataPopPtr){
  7.                 retval=retval+hringBuf->bufSize-hringBuf->dataPopPtr;
  8.         }else{
  9.                 retval-=hringBuf->dataPopPtr;
  10.         }
  11.         len=len>retval?retval:len;
  12.         retval=len;
  13.         while(len>0){
  14.                 *buf++=hringBuf->pBuf[hringBuf->dataPopPtr];
  15.                 hringBuf->dataPopPtr=(hringBuf->dataPopPtr+1)%hringBuf->bufSize;
  16.                 len--;
  17.         }
  18.         return retval;
  19. }
复制代码
这是仿照HAL库写的控制句柄
  1. struct ringBufHandlerType{
  2.         uint32_t bufSize;
  3.         uint32_t dataPopPtr;
  4.         uint8_t* pBuf;
  5. };
复制代码




上测试工程: DMARingBuf.zip (6.39 MB, 下载次数: 476)

评分

参与人数 2ST金币 +40 收起 理由
creep + 30 很给力!
MrJiu + 10 很给力!

查看全部评分

回复

使用道具 举报

该用户从未签到

3

主题

1002

帖子

363

蝴蝶豆

版主

最后登录
2021-4-15
发表于 2017-9-20 15:43:38 | 显示全部楼层
支持一个!!!
回复

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
 楼主| 发表于 2017-9-20 15:46:59 | 显示全部楼层
MrJiu 发表于 2017-9-20 15:43
支持一个!!!

谢谢支持
回复 支持 反对

使用道具 举报

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
发表于 2017-9-20 15:50:07 | 显示全部楼层
感谢分享!
回复

使用道具 举报

该用户从未签到

19

主题

1473

帖子

27

蝴蝶豆

论坛元老

最后登录
2021-11-17
发表于 2017-9-20 17:06:23 | 显示全部楼层
看标题不错,进来看看,正好需要,谢谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
 楼主| 发表于 2017-9-20 17:12:04 | 显示全部楼层
队长shiwo 发表于 2017-9-20 17:06
看标题不错,进来看看,正好需要,谢谢分享

可以试试。有啥问题可以反馈过来
回复 支持 反对

使用道具 举报

该用户从未签到

47

主题

3456

帖子

30

蝴蝶豆

版主

最后登录
2022-12-25
发表于 2017-9-20 21:56:50 | 显示全部楼层
赞赞赞。。。。支持
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

42

帖子

2

蝴蝶豆

高级会员

最后登录
2021-1-16
发表于 2017-10-16 17:23:43 | 显示全部楼层
想问一下环形缓冲和双缓冲各有什么优点和缺点。
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2017-10-16 19:58:19 | 显示全部楼层
学习下  
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
 楼主| 发表于 2017-10-17 09:22:28 | 显示全部楼层
大林林 发表于 2017-10-16 17:23
想问一下环形缓冲和双缓冲各有什么优点和缺点。

双缓冲区需要切换缓冲区。环形缓冲不需要。
环形缓冲区处理比双缓冲复杂。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-1 08:41 , Processed in 0.218751 second(s), 45 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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