你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
斜阳__ 发布时间:2017-9-20 15:37
当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, 下载次数: 461)

评分

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

查看全部评分

收藏 6 评论16 发布时间:2017-9-20 15:37

举报

16个回答
MrJiu 回答时间:2017-9-20 15:43:38
支持一个!!!
斜阳__ 回答时间:2017-9-20 15:46:59
MrJiu 发表于 2017-9-20 15:43
支持一个!!!

谢谢支持
creep 回答时间:2017-9-20 15:50:07
感谢分享!
队长shiwo 回答时间:2017-9-20 17:06:23
看标题不错,进来看看,正好需要,谢谢分享
斜阳__ 回答时间:2017-9-20 17:12:04
队长shiwo 发表于 2017-9-20 17:06
看标题不错,进来看看,正好需要,谢谢分享

可以试试。有啥问题可以反馈过来
Paderboy 回答时间:2017-9-20 21:56:50
赞赞赞。。。。支持
大林林 回答时间:2017-10-16 17:23:43
想问一下环形缓冲和双缓冲各有什么优点和缺点。
andeyqi 回答时间:2017-10-16 19:58:19
学习下  
斜阳__ 回答时间:2017-10-17 09:22:28
大林林 发表于 2017-10-16 17:23
想问一下环形缓冲和双缓冲各有什么优点和缺点。

双缓冲区需要切换缓冲区。环形缓冲不需要。
环形缓冲区处理比双缓冲复杂。
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版