实例介绍
TGAM数据流格式说明,详细的数据分析过程,以及开发需要注意的事项,不错的文档.pdf
3指定波特率,端口,点击Open按钮。如果连接成功,你应该会看到类似下图的数据。 RealTerm: Serial Capture Program 2.0.0.70 回x FC 62 1F AA 82FFB3 CB HH HE吧出 IU5HHHR叫48 它2059 C DC HA HE8205FHH啪H 第511 吧FB615mm啊8咖DRmm叫凯吧听8印即的凯 02 01 CO BC AA AA 04 80 D2 FC EE 93 AA AA 04 80 D2 FD-E4-9t AA AA 04 80 吧2吧吧HR8吧嗎51RH咀即也配扣张H叫8 2 FB BE C4mm队48F9叫H册吧FF074H的0 2051266H48009诞H的机吧印E89的8 Hm叫48 5HmHH叱EF?跚胎m』留 鸣81818两γ$鸣颀—— 第513个包 B出EH出图出如出啊 H叫48FFF87 048D0RDHH4049 H048吧FFF6F|HH048n2FR038HH048吧FBB AA AA 04 80 02 01 C9 B3D 第一个包 Display Port Capture Pins I Send Echo Port)12C |12C 2 12CMisc MiscI In Clear Freeze 2 Statu Baud 57600 -Port(19 p PY Ch Cisconner are flow Contro F>D(2 Parity Data b Receive× on chat:1 TXD [3] c 8 bits 1 bit COdd C 7 bits Hardware Flow Control Transmit Xoff Char: 19 C Even bil COD (1 C Mark C None RtS/ctS Winsock. CSR [6 C SpaccC hits C nTR/D.SR C RS485-ts Fing⑨9 Telnet BREAK Error You can use ActiveX automation to control me Char Count: 507136 CPS: 5600 Port: 19 576008 4.说明 TGAM大约每秒钟发送513个包,注意是“大约每秒钟”,意思就是发送包的个数是不会变 的,只是发送513个包所花费的时间是一秒左右。 发送的包有小包和大包两种:小包的格式是AAAA048002 XXHigh XXLow XX CheckSum 前面的AAAA048002是不变的,后三个字节是一只变化的, xXHigh和 XXLOW组成了原 始数据 rawdata, XXCheck sun就是校验和。所以一个小包里面只包含了一个对开发者来 说有用的数据,那就是 rawdata,可以说一个小包就是一个原始数据,大约每秒钟会有 512个原始数据。 那怎么从小包中解析出原始数据呢? rawdata=( xXHigh<<8)|xL_oW; if(rawdata>32768 rawdata-=65536; 3 现在原始数据就这么算出来了,但是在算原始数据之前,我们先应该检查校验和。校验 和怎么算呢?sum=(0X80+0×02+ xXHigh+ XXLoW)^0 XFFFFFFFF)&0xFF 什么意思呢?就是把04后面的四个字节加起来,取反,再取低八位。 如果算出来的sum和 xXCheck sum是相等的,那说明这个包是正确的,然后再去计算 rawdata,否则直接忽略这个包。丢包率在10%以下是不会对最后结果造成影响的。 现在,原始数据出来了,那我们怎么拿信号强度Sgna,专注度 Attention,放松度 Meditation,和8个 EEG Power的值呢?就在第513个这个大包里面,这个大包的格式是相 当固定的,我们就拿上图中的数据来一个字节一个字节地说明他们代表的含义: 红色的是不变的 AA同步 AA同步 20是十进制的32,即有32个字节的 payload,除掉20本身+两个AA同步+最后校验和 02代表信号值Sgna 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 LoW Alpha 3/3 17 HighAlpha 1/3 3B HighAlpha 2 /3 DC Highalpha 3/3 02 LoW Beta 1/3 50 LoW Beta 2/3 00 Low Beta 3/3 03 High Beta 1/3 CB HighBeta 2/3 9D HighBeta 3/3 03L。 oW Gamma1/3 6D LoW Gamma 2/3 3B LOW Gamma 3/3 03 Middle Gamma 1/3 7E Middle Gamma 2 /3 89 Middlegamma 3 /3 04代表专注度 Attention 00 Attention的值(0到100之间) 05代表放松度 Meditation 00 Meditation的值(0到100之间) D5校验和 解析 EEG Power:拿 Delta举例,Deta1/3是高字节,Deta1/3是中字节, Delta1/3是低 字节;高字节左移16位,中字节左移8位,低字节不变,然后捋他们或运算,得到的结 果就是Dea的值。这些值是无符号,没有单位的,只有在和其他的Beta, Gamma等值 相互比较时才有意义。 5关于眨眼 TGAM芯片本身是不会输出眨眼信号的,眨眼是用 rawdata原始数据算出来的。表现在原 始数据的波形上,眨眼就是一个很大的波峰。只要用代码检测这个波峰的出现,就可以 找到眨眼的值了。 还有,眨眼其实和脑电波一点儿关系都没有,眨眼只是眼睛动的时候在前额产生的肌 (肉)电,混合在了脑波原始数据中。 以下C#代码说明怎么解析数据。 using System; using System. Collections. Generic, using System. Ling using System. Text using System. Threading. T asks namespace readParse TGAM public class Parser public const int PARSER CODE POOR SIGNAL =2 public const int PARSER CODE HEaRtRatE=3 public const int PARSER CODE CONFIGURATION =4; public const int PARSER CODE RAW=128 public const int PARSER CODE DEBUG ONE=132 public const int PARSER CODE DEBUG TWO=133 public const int PARSER CODE EEG POWeR=131 public const int PST PACKET CHECKSUM FAILED=-2 public const int PST NOT YET COMPLETE PACKET=0 public const int PST PACKET PARSED SUCCESS=1 public const int MESSAGE READ RAW DATA PACKET=17 public const int MESSAGE READ DIGEST DATA PACKET=18 private const int RAW DATA BYTE LENGTH=2 private const int EEG DEBUG ONE BYTE LENGTH= 5 private const int EEG DEBUG TWO BYTE LENGTH= 3: private const int PARSER SYNC BYTE= 170 private const int PARSER EXCODE BYTE=85 private const int MULTI BYTE CODE THRESHOLD=127 private const int PARSER STATE SYnc= 1 private const int PARSER STATE SYNC CHECK =2 orivate const int PaRSEr STatE PAYload length =3 private const int PARSER STATE PAYLOAD= 4 private const int PARSER STATE CHKSUM=5 private int parserstatus; private int payloadLength; private int payload BytesReceived private int payload Sum private int checksum private bytel payload new byte [ 256 public Parser this parser Status= PARSER STATE SYNC public int parse Byte(byte buffer) int returnvalue =0 switch(this. parserStatus case if (buffer OxFF)!= PARSER SYNC BYTE)break; this parser Status PARSER STATE SYNC CHECK break. case 2. if(buffer & OXFF)== PARSER SYNC_ BYTE this parserStatus PARSER STATE PAYLOAD LENGTH else this parser Status PARSER STATE SYNC break. case 3: this payloadLength=(buffer OXFF) thispayload BytesReceived =0 this payload sum =0 this parser Status PARSER STATE PAYLOAD reaK, case 4. this payload[(this payload BytesReceived++)]= buffer this payload Sum +=(buffer & OXFF) if (this. payloadBytes Received <this. payloadLength)break; this parser'Status PARSER STATE CHKSUM break case 5: this checksum =(buffer OxFF) this parser Status PARSER STATE SYNC; if (this checksum!=((this payload Sum OxFFFFFFFF)&OxFF)) returnvalue =-2 Console. WriteLine "Check Sum ERROR! else returnvalue 1 parsePacketPayload(: break return returnvalue private void parse PacketPayloado inti=0: int extendedCodelevel =0 int code =0; int value BytesLength=0 int signal=0; int config =0; int heartrate =0; nt rawWaveData=0 while(i< this. payloadLength) extended codelevel++ while(this payload[== PARsEr EXCODE bYTe) ++; code =this payload(i++)]& OxFF if (code> MULTI BYTE CODE THRESHOLD) valueBytesLength=this payload[(++)]& OXFF else value BytesLength =1 if(code == PARSER CODE RAW) if ((value BytesLength = RAW DATA BYTE LENGTH) byte highOrder Byte this payload byte lowOrderByte this payload[(i+ 1)1 raw Wave Data getRaw Wave Value(highOrder Byte, lowOrder Byte) if (raw Wave Data> 32768 raw WaveData-=65536; Console. WriteLine(Raw: +raw WaveData): + value BytesLength else switch(code) case PARSER CODE POOR SIGNAL signal= this payload[]& OXFF i + valueBytesLength Console. Write(PQ: signal) break case PARSER CODE EEG POWer i + value BytesLength break case PARSER CODE CONFIGURATION Signal等于以下值,代表耳机没有戴好 f( signa|==29‖ signal=54‖ signa==55| signa|==56‖| signal==80‖ gnal 81 signal ==82 signal ==107 signal ==200) config = this payload[]&OXFF Console. Write "-NoShouldAtt: config) Console. Write Line("); i + value BytesLength break. else config=this payload[& OXFF Console.Write("--Att: config) Console. WriteLine() += value BytesLength break case PARSER CODE HEARTrate heartrate this payload[ OXFF leBytesLength break case PARSER CODE DEBUG ONE if (value BytesLength == EEG DEBUG ONE BYTE LENGTH) + value BytesLength eak case PARSER CODE DEBUG TWo if (value BytesLength ==EEG DEBUG TWO BYTE LENGTH) i + value BytesLength break this parser Status= PARSER STATE SYNC: private int getRaw Wave Value(byte high Byte, byte low Order Byte) /R Sign-extend the signed high byte to the width of a signed int int hi=(inthighOrderByte; Extend low to the width of an int, but keep exact bits instead of sign-extending * int lo =((int)lowOrder Byte)&OXFF 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论