您的位置:首页 > 其它

脑波设备mindwave数据流二次开发示例

2015-06-15 11:44 477 查看
数据流开发神念科技提供了两个文件ThinkGearStreamParse.h和ThinkGearStreamParse.cpp两个文件,主要接口为:

宏定义:

/* Data CODE definitions */

#define PARSER_CODE_BATTERY 0x01

#define PARSER_CODE_POOR_QUALITY 0x02

#define PARSER_CODE_ATTENTION 0x04

#define PARSER_CODE_MEDITATION 0x05

#define PARSER_CODE_8BITRAW_SIGNAL 0x06

#define PARSER_CODE_RAW_MARKER 0x07

#define PARSER_CODE_RAW_SIGNAL 0x80

#define PARSER_CODE_EEG_POWERS 0x81

#define PARSER_CODE_ASIC_EEG_POWER_INT 0x83

表示数据类型

typedef struct _ThinkGearStreamParser {

unsigned char type;

unsigned char state;

unsigned char lastByte;

unsigned char payloadLength;

unsigned char payloadBytesReceived;

unsigned char payload[256];

unsigned char payloadSum;

unsigned char chksum;

void (*handleDataValue)( unsigned char extendedCodeLevel,

unsigned char code, unsigned char numBytes,

const unsigned char *value, void *customData );

void *customData;

} ThinkGearStreamParser;

分析结构体,保存着buffer和状态机

int

THINKGEAR_initParser( ThinkGearStreamParser *parser, unsigned char parserType,

void (*handleDataValueFunc)(

unsigned char extendedCodeLevel,

unsigned char code, unsigned char numBytes,

const unsigned char *value, void *customData),

void *customData );

初始化分析状态机

int

THINKGEAR_parseByte( ThinkGearStreamParser *parser, unsigned char byte );

分析数据,每收到一个字节,都送到状态机里去处理。

示例代码如下:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "ThinkGearStreamParser.h"

#define USE_COMPORT "com3"

#if 0
/* Data CODE definitions */
#define PARSER_CODE_BATTERY            0x01
#define PARSER_CODE_POOR_QUALITY       0x02
#define PARSER_CODE_ATTENTION          0x04
#define PARSER_CODE_MEDITATION         0x05
#define PARSER_CODE_8BITRAW_SIGNAL     0x06
#define PARSER_CODE_RAW_MARKER         0x07

#define PARSER_CODE_RAW_SIGNAL         0x80
#define PARSER_CODE_EEG_POWERS         0x81
#define PARSER_CODE_ASIC_EEG_POWER_INT 0x83
#endif

// 处理数据回调函数
void handleDataValueFunc( unsigned char extendedCodeLevel,
unsigned char code,  // 数据类型
unsigned char numBytes,  // 数据长度
const unsigned char *value,  // 数据
void *customData )  // 自定义数据
{
static int meditation = 0;
static int attention = 0;
static int count = 0;
if(extendedCodeLevel == 0)
{
switch(code)
{
// 如果是信号质量,则打印信号质量
case PARSER_CODE_POOR_QUALITY:
printf("the PARSER_CODE_POOR_QUALITY is %d\n", value[0]&0xff);
break;
// 04是专注度数据
case 0x04:
count ++;
attention = value[0]&0xff;
printf("the attention is %d\n", attention);
break;
// 05是放松度数据
case 0x05:
count++;
meditation = value[0]& 0xff;
printf("the meditation is %d\n", value[0]& 0xff);
break;
}
}

}

int main()
{
// 定义神念数据分析流结构体
ThinkGearStreamParser parser;
int quitFlag = 0;

// 初始化结构体
::THINKGEAR_initParser(&parser, PARSER_TYPE_PACKETS, handleDataValueFunc, &quitFlag);

// 打开串口,蓝牙已经被转换为串口了
HANDLE hCom;
hCom = CreateFileA(USE_COMPORT,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
printf("Error open serial\n");
exit(1);
}

// 一序列串口设置
COMMTIMEOUTS TimeOuts;
if(!SetupComm(hCom, 2048, 2048))
return false;

//设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0;

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 100;
TimeOuts.WriteTotalTimeoutConstant = 500;
if(!SetCommTimeouts(hCom, &TimeOuts))
return 0;//设置超时

DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = 57600; //波特率为57600
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = ONESTOPBIT; //两个停止位
if(!SetCommState(hCom, &dcb))
return 0;

if(!PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR))
return 0;

// 从串口下接收数据
unsigned char streamByte;
DWORD dwRead;
while(!quitFlag)
{
// 从串口读取一个字节,然后把字节送到神念分析接口去分析
if(ReadFile(hCom, &streamByte, 1, &dwRead, NULL))
THINKGEAR_parseByte(&parser, streamByte);
}

CloseHandle(hCom);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: