}
void comm_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{
//
// if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = comm_1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
// received_count += n;//增加接收计数
comm_1.Read(buf, 0, n);//读取缓冲数据
// builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.BeginInvoke((EventHandler)(delegate
{
//判断是否是显示为16进制
if (n > 8)
{
System.Windows.Forms.DataVisualization.Charting.Series series0 = chart1.Series[0];
chart1.ChartAreas[0].AxisX.Interval = 20;
chart1.ChartAreas[0].AxisY.Interval = 20;
chart1.Series[0].Color = Color.Black;
for (int i = 8; i < n - 1; i++)
{
HeartData.Add(buf[i]);
series0.Points.AddY(buf[i]);
if (HeartData.Count == 400)
{
int[] result = SoAndChan(HeartData.ToArray());
if(result.Length>0)
for(int l=0;l< result.Length;l++)
{
// textBoxH.AppendText(Convert.ToString(result[l]+","));
if (HeartDataHandleS1.Count < 6)
HeartDataHandleS1.Add(HeartData[result[l]]);
else
HeartDataHandleS2.Add(HeartData[result[l]]);
}
HeartData.Clear();
}
}
chart1.ChartAreas[0].AxisX.Maximum = 1300;
chart1.ChartAreas[0].AxisX.Minimum = 0;
if (chart1.Series[0].Points.Count > 100)
{
chart1.Series[0].Points.RemoveAt(0);
chart1.Series[0].Points.RemoveAt(1);
chart1.Series[0].Points.RemoveAt(2);
chart1.Series[0].Points.RemoveAt(3);
chart1.Series[0].Points.RemoveAt(4);
chart1.Series[0].Points.RemoveAt(5);
chart1.Series[0].Points.RemoveAt(6);
chart1.Series[0].Points.RemoveAt(7);
chart1.Series[0].Points.RemoveAt(8);
chart1.Series[0].Points.RemoveAt(9);
chart1.Series[0].Points.RemoveAt(10);
chart1.Series[0].Points.RemoveAt(11);
chart1.Series[0].Points.RemoveAt(12);
chart1.Series[0].Points.RemoveAt(13);
chart1.Series[0].Points.RemoveAt(14);
chart1.Series[0].Points.RemoveAt(15);
chart1.Series[0].Points.RemoveAt(16);
chart1.Series[0].Points.RemoveAt(17);
chart1.Series[0].Points.RemoveAt(18);
chart1.Series[0].Points.RemoveAt(19);
}
if (HeartDataHandleS1.Count > 5&& HeartDataHandleS2.Count>5)
{
var data = new List() {
new double[] {111,154,132.5},
new double[] {123,134,128.81},
new double[] {140,160,152.14},
new double[] {140,204,176},
new double[] {160,184,172},
new double[] {159,165,162},
};
var labels = new List()
{
1,1,1,0,0,0
};
MachineLearning.Classification.KNN knn = new KNN(k: 3, labels: labels, features: data);
// knn.Display();
knn.Classify(new double[][] { new double[] { HeartDataHandleS1.Min(), HeartDataHandleS1.Max(), HeartDataHandleS1.Average() } });
result1 = knn.Display();
knn.Classify(new double[][] { new double[] { HeartDataHandleS2.Min(), HeartDataHandleS2.Max(), HeartDataHandleS2.Average() } });
result2 = knn.Display();
if (result1.Equals("1")&& result2.Equals("1"))
textBoxH.AppendText("心率没有异常!"+"\n");
else
textBoxH.AppendText("心率有异常!");
textBox2.Text = @"心率:" + H + "\n" + "血氧饱和度:" + BO + "\n" + "舒张压:" + WSZ + "\n" + "伸缩压: " + WSS + "\n"+"体温:"+Temp+"\n";
HeartDataHandleS1.Clear();
HeartDataHandleS2.Clear();
}
if (series0.Points.Count > 2000)
{
ExportChart("chart", chart1);
series0.Points.Clear();
}
// mycon.Close();
}
//追加的形式添加到文本框末端,并滚动到最后。
//this.txGet.AppendText(builder.ToString());
//修改接收计数
//labelGetCount.Text = "Get:" + received_count.ToString();
}));
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}
}
void comm_DataReceived_3(object sender, SerialDataReceivedEventArgs e)
{
//
// if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
int n = comm_2.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
// received_count += n;//增加接收计数
comm_2.Read(buf, 0, n);
this.BeginInvoke((EventHandler)(delegate
{
//判断是否是显示为16进制
// comm_2.WriteLine(new string(new char[] { FF C0 03 A3 A0 }));
if(n==10)
{
textBox4.AppendText("收缩压:"+buf[6].ToString() + ",");
textBox4.AppendText("舒张压:"+buf[8].ToString() + ",");
textBox4.AppendText("心率为:"+buf[9].ToString());
WSS = buf[6].ToString();
WSZ = buf[8].ToString();
H = buf[9].ToString();
}
}));
}
finally
{
}
}
void comm_DataReceived_4(object sender, SerialDataReceivedEventArgs e)
{
//
// if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
int n = comm_4.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
// received_count += n;//增加接收计数
comm_4.Read(buf, 0, n);
this.BeginInvoke((EventHandler)(delegate
{
//判断是否是显示为16进制
// comm_2.WriteLine(new string(new char[] { FF C0 03 A3 A0 }));
if (n == 7)
{
// textBox4.AppendText("体温:" + buf[5].ToString() + ",");
textBox4.AppendText("体温:" + (buf[6]-71) + ",");
Temp = (buf[6] - 71).ToString();
}
}));
}
finally
{
}
}
void comm_DataReceived_2(object sender, SerialDataReceivedEventArgs e)
{
//
// if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
// received_count += n;//增加接收计数
comm.Read(buf, 0, n);//读取缓冲数据
// builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.BeginInvoke((EventHandler)(delegate
{
//判断是否是显示为16进制
if (n > 7)
{
chart2.ChartAreas[0].AxisX.Interval = 8;
chart2.ChartAreas[0].AxisY.Interval = 10;
chart3.ChartAreas[0].AxisX.Interval = 8;
chart3.ChartAreas[0].AxisY.Interval = 10;
chart4.ChartAreas[0].AxisX.Interval = 8;
chart4.ChartAreas[0].AxisY.Interval = 10;
System.Windows.Forms.DataVisualization.Charting.Series series0 = chart2.Series[0];
System.Windows.Forms.DataVisualization.Charting.Series series1 = chart3.Series[0];
System.Windows.Forms.DataVisualization.Charting.Series series3 = chart4.Series[0];
chart2.Series[0].Color = Color.Black;
chart3.Series[0].Color = Color.Black;
chart4.Series[0].Color = Color.Black;
// for (int i = 8; i < n - 1; i++)
// {
series0.Points.AddY(buf[7]); //HEARTh
series1.Points.AddY(buf[5]); //WAVE
series3.Points.AddY(buf[6]); //bo
BO = buf[6].ToString();
// SendHeartData(buf[7].ToString()+","+buf[5].ToString()+","+buf[6].ToString());
chart2.ChartAreas[0].AxisX.Maximum = 200;
chart2.ChartAreas[0].AxisX.Minimum = 0;
if (chart2.Series[0].Points.Count > 200)
{
chart2.Series[0].Points.RemoveAt(0);
if (chart2.Series[0].Points.Count > 1000)
{
ExportChart("chart2", chart2);
ExportChart("chart4", chart4);
chart2.Series[0].Points.Clear();
// series1.Points.Clear();
}
}
chart3.ChartAreas[0].AxisX.Maximum = 200;
chart3.ChartAreas[0].AxisX.Minimum = 0;
if (chart3.Series[0].Points.Count > 190)
{
chart3.Series[0].Points.RemoveAt(0);
chart3.Series[0].Points.RemoveAt(1);
// chart3.Series[0].Points.RemoveAt(2);
// chart3.Series[0].Points.RemoveAt(3);
// chart3.Series[0].Points.RemoveAt(4);
// chart3.Series[0].Points.RemoveAt(5);
// chart3.Series[0].Points.RemoveAt(6);
// chart3.Series[0].Points.RemoveAt(7);
//chart3.Series[0].Points.RemoveAt(8);
//chart3.Series[0].Points.RemoveAt(9);
}
chart4.ChartAreas[0].AxisX.Maximum = 200;
chart4.ChartAreas[0].AxisX.Minimum = 0;
if (chart4.Series[0].Points.Count > 200)
{
chart4.Series[0].Points.RemoveAt(0);
if (chart4.Series[0].Points.Count > 1000)
{
ExportChart("chart2", chart2);
ExportChart("chart3", chart3);
ExportChart("chart4", chart4);
chart4.Series[0].Points.Clear();
chart3.Series[0].Points.Clear();
}
}
// mycon.Close();
}
//追加的形式添加到文本框末端,并滚动到最后。
//this.txGet.AppendText(builder.ToString());
//修改接收计数
//labelGetCount.Text = "Get:" + received_count.ToString();
}));
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}
}
private static void DataBind()
{
throw new NotImplementedException();
}
private void buttonOpenClose_Click(object sender, EventArgs e)
{
//根据当前串口对象,来判断操作
if (comm.IsOpen)
{
Closing = true;
while (Listening) System.Windows.Forms.Application.DoEvents();
//打开时点击,则关闭串口
comm.Close();
Closing = false;
}
else
{
//关闭时点击,则设置好端口,波特率后打开
comm.PortName = comboPortName.Text;
// comm.BaudRate = int.Parse(comboBaudrate.Text);
try
{
comm.Open();
}
catch (Exception ex)
{
//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
comm = new SerialPort();
//现实异常信息给客户。
MessageBox.Show(ex.Message);
}
}
//设置按钮的状态
//buttonOpenClose.Text = comm.IsOpen ? "Close" : "Open";
}