C# 使用Neurosky设备记录来自特定命令的数据
我试图用Neurosky设备记录原始数据,我成功地做到了。但我需要编写一个命令(例如移动你的右臂),然后记录该命令的数据,但问题是OnDataReceived事件一直被触发,我不知道在记录数据之前在哪里可以为该命令添加一些代码。有什么帮助吗? 我的代码:C# 使用Neurosky设备记录来自特定命令的数据,c#,C#,我试图用Neurosky设备记录原始数据,我成功地做到了。但我需要编写一个命令(例如移动你的右臂),然后记录该命令的数据,但问题是OnDataReceived事件一直被触发,我不知道在记录数据之前在哪里可以为该命令添加一些代码。有什么帮助吗? 我的代码: using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; using System
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO;
using System.IO.Ports;
using NeuroSky.ThinkGear;
using NeuroSky.ThinkGear.Algorithms;
using System.Collections;
namespace testprogram
{
class Program
{
static Connector connector;
static HeartRateAcceleration heartRateAcceleration;
static HeartRateRecovery heartRateRecovery;
static byte poorSig;
static int train;
public static void Main(string[] args)
{
Console.WriteLine("Hello EEG!");
// Initialize a new Connector and add event handlers
connector = new Connector();
connector.DeviceConnected += new EventHandler(OnDeviceConnected);
connector.DeviceConnectFail += new EventHandler(OnDeviceFail);
connector.DeviceValidating += new EventHandler(OnDeviceValidating);
Connector.EKGPersonalizationEvent += new EventHandler(OnEKGPersonalizationEvent);
heartRateRecovery = new HeartRateRecovery();
heartRateAcceleration = new HeartRateAcceleration();
// Scan for devices
connector.ConnectScan("COM40");
// Enable Energy level calculation
// connector.StartEnergyLevel();
//connector.GetHeartAge(90, "Neraj");
connector.EKGstartLongTraining("Neraj");
Thread.Sleep(450000);
//Console.WriteLine(connector.GetHeartRiskAware("Neraj"));
//Console.WriteLine(connector.GetHeartAgeStatus("Neraj"));
//Console.WriteLine(connector.ResetHeartAge("Neraj"));
System.Console.WriteLine("Goodbye.");
// Close all open connections
connector.Close();
Environment.Exit(0);
}
static void OnEKGPersonalizationEvent(object sender, EventArgs e)
{
EKGPersonalizationEventArgs ekgArgs = (EKGPersonalizationEventArgs)(e);
int status = ekgArgs.statusMessage;
switch (status)
{
case 268:
string data = (string)(ekgArgs.dataMessage);
Console.WriteLine("Handler Message: status = MSG_EKG_IDENTIFIED " + " and username = " + data);
break;
case 269:
Console.WriteLine("Handler Message: status = MSG_EKG_TRAINED");
connector.EKGstartDetection();
break;
case 270:
int trainStep = (int)ekgArgs.dataMessage;
Console.WriteLine("Handler Message: status = MSG_EKG_TRAIN_STEP " + " and training step = " + trainStep);
break;
case 271:
Console.WriteLine("Handler Message: status = MSG_EKG_TRAIN_TOUCH");
break;
}
}
/**
* Called when a device is connected
*/
static void OnDeviceConnected(object sender, EventArgs e)
{
Connector.DeviceEventArgs de = (Connector.DeviceEventArgs)e;
Console.WriteLine("Device found on: " + de.Device.PortName);
de.Device.DataReceived += new EventHandler(OnDataReceived);
}
/**
* Called when scanning fails
*/
static void OnDeviceFail(object sender, EventArgs e)
{
Console.WriteLine("No devices found! :(");
}
/**
* Called when each port is being validated
*/
static void OnDeviceValidating(object sender, EventArgs e)
{
Console.WriteLine("Validating: ");
heartRateRecovery.enableHeartRateRecovery();
}
/**
* Called when data is received from a device
*/
static void OnDataReceived(object sender, EventArgs e)
{
//Device d = (Device)sender;
Device.DataEventArgs de = (Device.DataEventArgs)e;
DataRow[] tempDataRowArray = de.DataRowArray;
TGParser tgParser = new TGParser();
tgParser.Read(de.DataRowArray);
/* Loop through new parsed data */
ArrayList data = new ArrayList();
for (int i = 0; i < tgParser.ParsedData.Length; i++)
{
if (tgParser.ParsedData[i].ContainsKey("Raw"))
{
Console.WriteLine("Raw Value:" + tgParser.ParsedData[i]["Raw"]);
data.Add(tgParser.ParsedData[i]["Raw"]);
}
}
AnalyizeData(data);
}
private static void AnalyizeData(ArrayList data)
{
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用系统线程;
使用System.IO;
使用System.IO.Ports;
使用NeuroSky.ThinkGear;
使用NeuroSky.ThinkGear.Algorithms;
使用系统集合;
名称空间测试程序
{
班级计划
{
静电连接器;
静态心率加速心率加速;
静态心率恢复心率恢复;
静态字节poorSig;
静态int列车;
公共静态void Main(字符串[]args)
{
控制台。WriteLine(“你好,EEG!”);
//初始化新连接器并添加事件处理程序
连接器=新连接器();
connector.DeviceConnected+=新事件处理程序(OnDeviceConnect);
connector.DeviceConnectionFail+=新事件处理程序(OnDeviceFail);
connector.DeviceValidating+=新事件处理程序(OnDeviceValidating);
Connector.EKGPersonalizationEvent+=新事件处理程序(OnEKGPersonalizationEvent);
heartRateRecovery=新的heartRateRecovery();
心率加速=新心率加速();
//扫描设备
连接器。连接扫描(“COM40”);
//启用能级计算
//connector.StartEnergyLevel();
//连接器。GetHeartAge(90,“Neraj”);
连接器:EKGstartLongTraining(“Neraj”);
睡眠(45万);
//Console.WriteLine(connector.GetHeartRiskAware(“Neraj”);
//Console.WriteLine(connector.GetHeartAgeStatus(“Neraj”);
//Console.WriteLine(connector.ResetHeartAge(“Neraj”);
System.Console.WriteLine(“再见”);
//关闭所有打开的连接
连接器。关闭();
环境。退出(0);
}
静态void OnEKGPersonalizationEvent(对象发送方,事件参数e)
{
EKGPersonalizationEventArgs ekgArgs=(EKGPersonalizationEventArgs)(e);
int status=ekgArgs.statusMessage;
开关(状态)
{
案例268:
字符串数据=(字符串)(ekgArgs.dataMessage);
Console.WriteLine(“处理程序消息:status=MSG_EKG_IDENTIFIED”+”和username=“+data”);
打破
案例269:
Console.WriteLine(“处理程序消息:status=MSG_EKG_TRAINED”);
连接器.EKGstartDetection();
打破
案例270:
int trainStep=(int)ekgArgs.dataMessage;
Console.WriteLine(“处理程序消息:状态=MSG_EKG_TRAIN_STEP”+”和training STEP=“+trainStep”);
打破
案例271:
Console.WriteLine(“处理程序消息:状态=MSG_EKG_TRAIN_TOUCH”);
打破
}
}
/**
*连接设备时调用
*/
静态无效OnDeviconnected(对象发送方,事件参数e)
{
Connector.DeviceEventArgs de=(Connector.DeviceEventArgs)e;
Console.WriteLine(“在:+de.Device.PortName上找到的设备”);
de.Device.DataReceived+=新的事件处理程序(OnDataReceived);
}
/**
*扫描失败时调用
*/
静态void OnDeviceFail(对象发送方,事件参数e)
{
Console.WriteLine(“未找到任何设备!”:(“”);
}
/**
*在验证每个端口时调用
*/
静态无效OnDeviceValidating(对象发送方,事件参数e)
{
Console.WriteLine(“验证:”);
heartRateRecovery.enableHeartRateRecovery();
}
/**
*从设备接收数据时调用
*/
静态无效OnDataReceived(对象发送方,事件参数e)
{
//设备d=(设备)发送器;
Device.DataEventArgs de=(Device.DataEventArgs)e;
DataRow[]tempDataRowArray=de.DataRowArray;
TGParser TGParser=新的TGParser();
tgParser.Read(de.DataRowArray);
/*循环遍历新解析的数据*/
ArrayList数据=新的ArrayList();
for(int i=0;i
您的代码缺少一个块,因此无法关闭。您使用的是睡眠(4500000)。您需要在main()中使用while循环方法,用于检查数据发送数据是否可用。将睡眠替换为while,然后在while循环中添加要发送的代码。但是,由于OnDataReceived事件被连续调用,它将永远不会再转到main。这不是真的。当接收事件完成时,它将返回到main,直到下一个事件发生。在当前代码中,您可以这样做看不到,因为它正在恢复睡眠(45万)并且什么也不做。是的..但事件始终发生是的,事件不断发生,但在一个事件完成和下一个事件发生之间有一段时间。在您的计算机上,有很多事件不断发生,并且计划程序允许任务切换,因此所有进程都同时运行。OnData接收