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

BMD101传感器协议解析与STM32实现(LCD显示波形)

[复制链接]
STMCU小助手 发布时间:2021-8-19 14:15
1 前言
BMD101传感器是神念科技开发的心电传感器。目前有一些商家开发了BMD101传感器模块,基本上都是利用蓝牙直接传输数据到PC或手机端。而本文介绍通过串口将数据传送给单片机,并在单片机上完成数据解析和心电波形LCD显示的功能。


2 通信协议解读
BMD101 通过 UART 接口通信。这是一个标准的 UART 接口,定义为 1 个起始位,8 个数据位,1 停止位格式,波特率 57600。
串口输出的数据包格式如下:
1.png


包括Header(帧头)、data payload(数据有效载荷)、CRC校验字节三个部分。


帧头包括两个SYNC字节(其值均为0xAA),用于指示一帧数据的开始。帧头的plength字节用于指示数据有效载荷部分的字节数。它的值可能是0-169的某一值。


Data Payload 是由一系列连续的 DataRow 组成。分析 Data Payload 涉及到解析每个 DataRow。DataRow的组成如下:
2.png


DataRow 起始位可能有零个或多个[EXCODE](扩展代码)字节,这些字节的值均为 0x55。EXCODE 字节数表示 Extended Code Level。Extended Code Level 是用来与
  1. 字节一起确定DataRow的数据表示的是什么方面的信息。 如下表所示,例如:Extended Code Level为0和[CODE]=0x02决定了当前DataRow表示的是信号质量的信息.[/size][/font][font=微软雅黑][size=3] 3.png [/size][/font]
  2. [font=微软雅黑][size=3]如果[CODE]字节在 0x00 和 0x7F 之间,那么DataRow就没有[LENGTH]字节,紧跟着[CODE]的是一个字节的[DATA]值,然后 DataRow 结束。[/size][/font]
  3. [font=微软雅黑][size=3]
  4. [/size][/font]
  5. [font=微软雅黑][size=3]如果[CODE]字节的值在 0x80 和 0xFF 之间,那么紧跟着是[LENGTH],它表示[DATA]的字节数。[/size][/font]
  6. [font=微软雅黑][size=3]
  7. [/size][/font]
  8. [font=微软雅黑][size=3]通常我们从BMD101接收到的DataRow主要有三种:[CODE]=0x02,即信号质量数据,信号质量是一个介于0-200之间的数据,数值越大表示传感器采集到的信号质量越好,等于0时可能是因为电极与人体接触不良。[/size][/font]
  9. [font=微软雅黑][size=3]
  10. [/size][/font]
  11. [font=微软雅黑][size=3][CODE]=0x03,即实时的心率数据,用一个字节表示。这也是BMD101的方便之处,开发者不必再通过算法求出心率,只需通过读取串口发送的心率数据即可,心率数据一般每秒发送一次,但在信号质量不佳时仍然会输出心率数据,因此在使用心率数据前应该验证信号质量是否过差。[/size][/font]
  12. [font=微软雅黑][size=3]
  13. [/size][/font]
  14. [font=微软雅黑][size=3][CODE]=0x80时,输出的数据[DATA]表示原始的心电波形数据,每一个数据由16位补码组成,其值范围为-32768到32767之间。这16位数据的第一个字节是高8位字节,第二个字节是低8位,为了通过这两个字节还原心电波形数据值,可以通过以下代码完成:[/size][/font]
  15. [font=微软雅黑][size=3]short raw =(Value[0]<<8) | Value[1];[/size][/font]
  16. [font=微软雅黑][size=3][DATA]可能包含了很多个心电数据,因此可能由很多个字节组成,通常BMD101每秒输出512个原始心电波形数据,即采样率为512Hz。[/size][/font]
  17. [font=微软雅黑][size=3]
  18. [/size][/font]
  19. [font=微软雅黑][size=3]数据包解析步骤[/size][/font]
  20. [font=微软雅黑][size=3]从数据流中连续读取字节,直到[SYNC]字节(0xAA)时。[/size][/font]
  21. [font=微软雅黑][size=3]读取下一个字节,并确保它也是一个[SYNC]字节(如果没有,返回步骤 1)。[/size][/font]
  22. [font=微软雅黑][size=3]读[PLENGTH]字节。[/size][/font]
  23. [font=微软雅黑][size=3]从[PAYLOAD…]中读取下一个 PLENGTH 字节,把它们保存在一个存储区域(如[/size][/font]
  24. [font=微软雅黑][size=3]unsigned char payload [ 256 ]数组)。按照接收的顺序累加每一个字节到校验器中。[/size][/font]
  25. [font=微软雅黑][size=3]使校验器中的低 8 位取反。这里是 C 代码:[/size][/font]
  26. [font=微软雅黑][size=3]checksum &= 0xff;[/size][/font]
  27. [font=微软雅黑][size=3]checksum = ~ checksum & 0xff;[/size][/font]
  28. [font=微软雅黑][size=3]读取[CRC]字节并验证它是否符合你的计算校验和(如果没有,返回到步骤 1)。[/size][/font]
  29. [font=微软雅黑][size=3]循环,直到 payload[]数组中所有字节(也就是 DataRows)被解析:[/size][/font]
  30. [font=微软雅黑][size=3]a)解析和计算[EXCODE]字节的数值(0x55),一般在当前 DataRow 的开始。[/size][/font]
  31. [font=微软雅黑][size=3]b)解析当前 DataRow 中的[CODE]字节数据。[/size][/font]
  32. [font=微软雅黑][size=3]c)如果适用,解析当前 DataRow 中的[LENGTH]字节数据。[/size][/font]
  33. [font=微软雅黑][size=3]d)分析和处理 当前 DataRow 中的[DATA…]字节(或数组),基于 DataRow 的 [EXCODE]等级、[CODE]和[LENGTH]。 [/size][/font]
  34. [font=微软雅黑][size=3]e)如果不是所有的字节都从 payload []数组中解析完成,返回 a)解析下一个DataRow[/size][/font]
  35. [font=微软雅黑][size=3]
  36. [/size][/font]
  37. [font=微软雅黑][size=3]3 STM32实现数据包解析[/size][/font]
  38. [font=微软雅黑][size=3]配置STM32串口为中断接收方式,在中断服务函数中,完成数据包的接收与保存工作,代码如下:[/size][/font]


  39. [font=微软雅黑][size=3][code]<blockquote>u8 Uart2_Buffer[256];        //接收缓冲区
复制代码
下面给出数据解析的函数:
  1. <blockquote>void parse_payload(void) //对有效负载的内容作分析处理
复制代码
LCD显示用的是正点原子Mini板,以及相应的LCD库函数。

实现效果如下:
4.png


由于没有滤波处理,BMD101的输出信号噪声还是比较多的。另外BMD101对噪声十分敏感,传感器的串口不应该直接与开发板的串口通过杜邦线直接连接,否则波形失真严重。可以在两者之间增加一个数字隔离模块。





收藏 评论0 发布时间:2021-8-19 14:15

举报

0个回答

所属标签

相似分享

官网相关资源

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