去年我写了一篇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),即:
-
第一个字节小于127(0x7F)时,该数为正整数
如通道数据0x29 0x96 0x49 即为 2725449
-
第一个字节大于等于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。
是以为记!