【OpenBCI】(2):原始数据包解码

2019-04-14 17:05发布

  去年我写了一篇OpenBCI的博客【OpenBCI】:Matlab实时读取数据流(labstreaminglayer),讲述如何用python的SDK将OpenBCI数据读取到Matlab中。
   后来我想,既然是串口通信,能不能用Matlab串口直接读取OpenBCI的数据,跳过官方的python。答案是肯定的。下面讲述一下我利用串口调试助手对OpenBCI原始数据包的解码过程及其数据格式,这样大家可以用任何语言(例如C#,.Matlab等)的串口通信去开发OpenBCI,不再拘泥于python。

1.连接串口

   要利用串口调试助手去解码OpenBCI数据,我们先下载一个串口调试助手【串口调试助手下载】
   打开串口调试助手,设置串口格式如下: 串口波特率:115200 数据位:8 停止位:1 校验位:无   选择OpenBCI对应的串口号(我的是COM3),打开串口。此时我们再重启一下OpenBCI就可以看到,串口调试助手显示以下信息。代表OpenBCI就位。

2.获取数据包

  此时给串口发送不同的字母代表不同的指令: b--------------begin, 开始采集数据 s--------------stop,停止采集数据 f--------------filter,添加60Hz工频滤波器(国内为50Hz,暂时用不到) g--------------关闭60Hz工频滤波器(国内为50Hz,暂时用不到)   更多指令参考官方网站[OpenBCI指令集]
  我们在串口调试助手下面的发送框里,输入字母“b”,然后点击发送,OpenBCI就开始输出数据到串口,我们可以看到滚动的数据流。

3.数据包解码

  因为OpenBCI采样频率为250Hz,所以每秒有250个数据包,部分数据包放大看一下,如下图所示: 这里写图片描述   图中每一行代表一个数据包,每个数据包由33个字节组成,OpenBCI的所有采集数据(包括8通道的脑电数据和陀螺仪数据)都在这些数据包里。例如上图中的第一行,其数据格式如下:
这里写图片描述
  每个脑电通道数据由3个字节组成,该数据为:低字节序 有符号整数(little endian signed integer),即:
  1. 第一个字节小于127(0x7F)时,该数为正整数
    如通道数据0x29 0x96 0x49 即为 2725449
  2. 第一个字节大于等于127(0x7F)时,该数为负整数
    如通道数据0xE1 0x96 0x49,即为 -1993143
    可以理解为 0x01 0x00 0x00 0x00 - 0xE1 0x96 0x49 = -1993143
  计算出的整数乘以系数scale_fac_uVolts_per_count = 0.022351744455307063 即可得到单位为uV的电压数据。

4.结束语

  知晓了OpenBCI的数据包格式,这样大家可以用任何语言(例如C#,.Matlab等)的串口通信去读取OpenBCI的原始数据,不再拘泥于官方的python SDK。
  是以为记!