• 脑波设备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);
    }
    


  • 相关阅读:
    (转) dedecms中自定义数据模型
    (转)dedecms网页模板编写
    (转)dedecms入门
    (转)浅谈dedecms模板引擎工作原理及自定义标签
    (转)PHP数组的总结(很全面啊)
    (转)echo和print的区别
    (转)dedecms代码详解 很全面
    (转)php 函数名称前的@有什么作用
    (转)PHP正则表达式的快速学习方法
    GIS中mybatis_CMEU的配置方法
  • 原文地址:https://www.cnblogs.com/new0801/p/6177184.html
Copyright © 2020-2023  润新知