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

数据流开发神念科技提供了两个文件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
", value[0]&0xff);
			break;
			// 04是专注度数据
		case 0x04:  
			count ++;
			attention = value[0]&0xff;
			printf("the attention is %d
", attention);
			break;
			// 05是放松度数据
		case 0x05:
			count++;
			meditation = value[0]& 0xff;
			printf("the meditation is %d
", 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
");
		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);
}


原文地址:https://www.cnblogs.com/new0801/p/6177184.html