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

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

[复制链接]
斜阳 发布时间:2017-9-20 15:37
当DMA配置成循环接收后,DMA会自动将来自串口的数据循环写到设定的缓冲区中。通过定时查询缓冲区来取出数据。( ~6 G( K* l% _% l1 M# n
对于不定长数据可以通过检查包头和包长度判断是否接收一包完整数据。9 r# h  \. K1 O' l) m
该方案不需要使用空闲中断。不会丢失数据。1 H& d/ r/ N, p" u. _: U3 y
如果偶尔数据被覆盖,可以尝试扩大缓冲区。如果经常有数据被覆盖,要么是系统设计不合理。要么是处理器性能不足。/ E% L0 k, l" n3 J6 H
一下使用stm32L476 nucleo-64板* r- T5 U- }' K4 h; D3 h5 t
下面是串口配置; s: w0 B6 L# g
uartConfig.jpg
3 B9 r8 N* W8 s4 c  E; C- v& K1 o, e( }& C+ h% v, ^
DMA的配置
0 M* h! ^8 I' O# s9 Y uartDmaConfig.jpg ) F$ s/ o9 d# P
中断配置:为了使用发送完成回调,需要使能串口中断。  A+ N# Y2 ?9 I0 d7 A% `$ O8 Y" ?" _
uartNvicConfig.jpg
  l1 q3 E. w. H( _, J3 {* H  C' ]
3 R. e9 o8 F+ n2 ECubeMX的详细使用方法参见论坛中的入门贴。我就不多废话了。& C$ j8 F( r( ]/ N

1 f: ^# j3 H+ d% s7 g, u& k核心代码:用于从环形缓冲区中提取数据。
5 D) V4 y3 R" B! [! Y- ~/ a
  1. uint32_t ringBufPop(uint8_t *buf,uint32_t len,struct ringBufHandlerType *hringBuf,DMA_HandleTypeDef *hdma)
    $ ^: a4 O/ _; r
  2. {
    & Z/ I2 Q' v" {! X+ x
  3.         uint32_t retval;) Q+ U$ K9 `5 P# x! k
  4.         //计算数据量
    + Q, T* U4 I6 o" ~! X# `& J. {7 R
  5.         retval=hringBuf->bufSize - __HAL_DMA_GET_COUNTER(hdma);% p5 a  v" w, _7 B& J4 A5 U" B
  6.         if(retval<hringBuf->dataPopPtr){: h! l: y. Y0 b* v! h8 D
  7.                 retval=retval+hringBuf->bufSize-hringBuf->dataPopPtr;
    0 t- J: y5 @6 D2 Q  T$ f. O- d4 m: F3 D9 h
  8.         }else{# Y  V! y) j* d; ^, L3 ]  a5 Z
  9.                 retval-=hringBuf->dataPopPtr;" e" y) T( |) f( M) n% X  }
  10.         }
    * Z. d( z- V5 T1 m1 t
  11.         len=len>retval?retval:len;
    4 z& a& b' e8 n9 C
  12.         retval=len;& Y6 r$ @4 V8 p7 i7 p
  13.         while(len>0){
    % g! R* U8 x& E9 T
  14.                 *buf++=hringBuf->pBuf[hringBuf->dataPopPtr];
    ' w& {2 s3 [, H- W$ _5 m- I* w/ V
  15.                 hringBuf->dataPopPtr=(hringBuf->dataPopPtr+1)%hringBuf->bufSize;. `& e0 r+ @! l
  16.                 len--;
    $ W2 {- w+ O5 K+ S; z
  17.         }
    0 R+ W( C. i( m0 n) |  o$ b7 O% x
  18.         return retval;/ p; d' H" Y7 V5 ^! ]
  19. }
复制代码
这是仿照HAL库写的控制句柄! b1 K% u+ W4 `8 H. v
  1. struct ringBufHandlerType{! L( p/ R: f3 Y& q  {1 _
  2.         uint32_t bufSize;
    8 l# k7 i2 F5 f3 i: o4 v! b" ]
  3.         uint32_t dataPopPtr;; s6 z: E7 L- \1 n+ W' o
  4.         uint8_t* pBuf;  i' m9 c0 q3 t# R" M5 X
  5. };
复制代码

- q- X7 b# D( N  x% a9 Q" w9 o, P; x9 C  r8 y
) ^; o$ f9 r1 K$ c5 {

1 s  L) X/ l9 a3 |, V上测试工程: DMARingBuf.zip (6.39 MB, 下载次数: 476)

评分

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

查看全部评分

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

举报

16个回答
斜阳 回答时间:2017-10-27 13:29:17
队长shiwo 发表于 2017-10-27 11:35$ D' @5 C  W5 A. R
"对于不定长数据可以通过检查包头和包长度判断是否接收一包完整数据。"2 g9 D8 v$ ?+ l* t/ _
原来知道包头和包长度了,能否做到 ...

4 C) n  ]4 ^2 x' {' M2 u; e通过空闲中断,和包头包尾判断完成
队长shiwo 回答时间:2017-10-27 11:35:53
"对于不定长数据可以通过检查包头和包长度判断是否接收一包完整数据。"
# c/ v* D0 G) |# s3 R原来知道包头和包长度了,能否做到不知道包长度的判读接收完成的啊
斜阳 回答时间:2017-10-17 09:22:28
大林林 发表于 2017-10-16 17:23
- a2 \8 f0 I1 n5 N+ W想问一下环形缓冲和双缓冲各有什么优点和缺点。

4 B' O. ?6 J' w+ P. B双缓冲区需要切换缓冲区。环形缓冲不需要。
: Y6 c6 l0 p, ^+ j5 T环形缓冲区处理比双缓冲复杂。
MrJiu 回答时间:2017-9-20 15:43:38
支持一个!!!
斜阳 回答时间:2017-9-20 15:46:59
MrJiu 发表于 2017-9-20 15:43) N+ W) {+ y- u4 A& O
支持一个!!!

; f4 T: L& {0 J0 O谢谢支持
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
5 q1 @0 g7 A( V( B: W看标题不错,进来看看,正好需要,谢谢分享

/ f2 L/ g0 V; L可以试试。有啥问题可以反馈过来
Paderboy 回答时间:2017-9-20 21:56:50
赞赞赞。。。。支持
大林林 回答时间:2017-10-16 17:23:43
想问一下环形缓冲和双缓冲各有什么优点和缺点。
andey 回答时间:2017-10-16 19:58:19
提示: 作者被禁止或删除 内容自动屏蔽
zhumx 回答时间:2017-10-17 17:17:41
谢谢分享!mark一下
队长shiwo 回答时间:2017-10-30 10:07:44
斜阳__ 发表于 2017-10-27 13:29
/ R$ I! c  U" E2 x$ n2 X. Y通过空闲中断,和包头包尾判断完成

. N( D4 O+ r: B好的  谢谢指导
yby 回答时间:2019-5-30 07:41:46
感谢,下载学习下
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版