通过串口一,接受脑电波的数据,采用HC05蓝牙模块通过AT指令将波特率调成9600,从机模式,PIN改成0000,脑电波采集器作为主机模式,自动连接蓝牙模块,配置改成相同,就可以自动连接上,连接成功之后蓝牙模块的接受数据的灯会闪烁。
#include <SI_EFM8BB52_Register_Enums.h> bit receive_ok=0; //接收数据完成标志 //串口中用到u8 receive[36]={0}; //接收缓存 void SiLabs_Startup (void) { // Disable the watchdog here } void UartInit() //9600bps@11.0592MHz{ PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 ES = 1; //允许串口1中断 TR1 = 1; //启动定时器1 } void main(){ variable_init();//外设初始化 UartInit();//串口初始化 EA=1; //打开CPU总中断开关 while(1) { if(receive_ok) { receive_ok = 0; //处理你的代码 ES=1;//再次允许串口中断 } }} //串口中断服务程序void UART_Rountine() interrupt 4{ static u8 count;//串口接收计数的变量 if(RI) { RI=0; receive[count]=SBUF; if(count==0&&receive[count]==0xAA) //同步信号 { count++; } else if(count==1&&receive[count]==0xAA) //同步信号 { count++; } else if(count==2&&receive[count]==0x20) //十进制32,表示后面要接收32个字节数据 { count++; } else if(count==3&&receive[count]==0x02) //代表信号标识,下一个数据即为信号值数据 { count++; } else if(count==4) //信号值 { count++; } else if(count==5&&receive[count]==0x83) //代表EEG信号开始了 { count++; } else if(count==6&&receive[count]==0x18) //十进制24,代表EEG Power是由24个字节组成的 { count++; } else if (count >=7 && count < 35) { count++; //一直加到receive[35] } else if(count==35)//最后一个数据,判断校验和,数据多的话是求和 { count=0; //计数清0 receive_ok =1;//串口接收完成标志,在主程序中判断,并做处理,然后清0 ES=0; //暂时关中断,数据处理完毕后再ES=1; } else//以上有任何一个条件不满足,将技术清0 { count=0;//判断不满足条件就将计数值清零 } } }
T
脑波模块TGAM芯片大约每秒钟发送513个包,意思就是发送包的个数是不会变的,只是发送513个包所花费的时间是一秒左右。发送的包有小包和大包两种:小包的格式是AA AA 04 80 02 xxHigh xxLow xxCheckSum。前面的AA AA 04 80 02 是不变的,后三个字节是一直变化的,xxHigh和xxLow组成了原始数据rawdata,xxCheckSum就是校验和。所以一个小包里面只包含了一个对开发者来说有用的数据,那就是rawdata,可以说一个小包就是一个原始数据,大约每秒钟会有512个原始数据。小包数据的解析:rawdata = (xxHigh << 8) | xxLow;if(rawdata > 32768){ rawdata =65536; }现在原始数据就这么算出来了,但是在算原始数据之前,应先检查校验和。校验和的计算就是把04后面的四个字节加起来,取反,再取低八位sum = ((0x80 + 0x02 + xxHigh + xxLow)^ 0xFFFFFFFF) & 0xFF。如果算出来的sum和xxCheckSum是相等的,那说明这个包是正确的,然后再去计算rawdata,否则直接忽略这个包。丢包率在10%以下是不会对最后结果造成影响的。现在,原始数据出来了,就在第513个这个大包里面包含信号强度Signal,专注度Attention,放松度Meditation,和8个EEG Power的值,这个大包的格式是相当固定的,我们就拿上图中的数据来一个字节一个字节地说明他们代表的含义:
红色的是不变的
AA 同步,AA 同步,
20 是十进制的32,即有32个字节的payload,除掉20本身+两个AA同步+最后校验和
02 代表信号值Signal
C8 信号的值
83 代表EEG Power开始了
18 是十进制的24,说明EEG Power是由24个字节组成的,以下每三个字节为一组
18 Delta 1/3,D4 Delta 2/3,8B Delta 3/3
13 Theta 1/3,D1 Theta 2/3,69 Theta 3/3
02 LowAlpha 1/3,58 LowAlpha 2/3,C1 LowAlpha 3/3
17 HighAlpha 1/3,3B HighAlpha 2/3,DC HighAlpha 3/3
02 LowBeta 1/3,50 LowBeta 2/3,00 LowBeta 3/3
03 HighBeta 1/3,CB HighBeta 2/39D HighBeta 3/3
03 LowGamma 1/3,6D LowGamma 2/3,3B LowGamma 3/3
03 MiddleGamma 1/3,7E MiddleGamma 2/3,89 MiddleGamma 3/3
04 代表专注度Attention
00 Attention的值(0到100之间)
05 代表放松度Meditation
00 Meditation的值(0到100之间)
D5 校验和
解析EEG Power:拿Delta举例,Delta 1/3是高字节,Delta 1/3是中字节,Delta 1/3是低字节;高字节左移16位,中字节左移8位,低字节不变,然后将他们或运算,得到的结果就是Delta的值。这些值是无符号,没有单位的,只有在和其他的Beta,Gamma等值相互比较时才有意义。