这节主要介绍通过串口接收回来的数据,我是如何处理的。
首先跟负责硬件的同学约定好格式,首个字母作为标志,判断是哪一个数据,然后利用字符:和@约定为数据,然后裁剪出来,就获得了数据。
话不多说,上代码( this.Invoke里面的更新ui代码(在串口那一节里面有说)):
this.Invoke(new System.Threading.ThreadStart(delegate ()
{
//distances_label.Text = indata;
String temp = "";
int i = str.IndexOf(":");//找:的位置
int j = str.IndexOf("@");//找@的位置
switch (str.Substring(0, 1))
{
case "U"://超声波 //Substring(int startIndex, int length)
temp = (str.Substring(i + 1)).Substring(0, j - i - 1);//找出:和@之间的字符串
/*if (int.Parse(temp) == -1)
{
distances_label.Text = "0cm";
}*/
//else{}
distances_label.Text = temp + "cm";
break;
case "P"://光敏
temp = (str.Substring(i + 1)).Substring(0, j - i - 1);//找出:和@之间的字符串
R_label.Text = temp + "Ω";
break;
case "S"://红外
temp = (str.Substring(i + 1)).Substring(0, j - i - 1);
if (temp =="1")
{
HW_Label.Text = "有人";
}
else
{
HW_Label.Text = "没有人";
}
break;
case "H"://H48.0@T28.0& 温湿度
int H_F = str.IndexOf("H");//找H的位置
int H_L = str.IndexOf("@");//找@的位置
string H_temp = (str.Substring(H_F + 1)).Substring(0, H_L - H_F - 1);
Hum_label.Text = H_temp + "%";
int T_F= str.IndexOf("T");
int T_L = str.IndexOf("&");//找&的位置
string T_temp = (str.Substring(T_F + 1)).Substring(0, T_L - T_F - 1);
Tep_label.Text = T_temp + "°C";
UpdateQueueValue(T_temp, H_temp);
break;
}
}));
通过str.IndexOf返回的位置,把数据取出来,再进行text的赋值。因为温湿度是一起传上来的,所以用不同的字符进行隔开,我定义的数据形式是H48.0@T28.0&,所以截取H@之间和T&之间的数据,其他同理。
这里是更新图表里面的数据。 (如果之前用随机数测试的话,记得把定时器里面更新数据函数去掉,在这里进行数值更新)
UpdateQueueValue(T_temp, H_temp);
下面就是把数据的输出成txt文本和保存截图。
先看一下输出效果:(我选择全部输出,前面提到设置了三种)
保存了在E盘的根目录下:
其实是把数据综合起来,然后在进行写入文件。
定义一个String
String output = "";
输出按钮的代码,判断是输出哪一个调用对应的函数再写入文件:(012就是对应我的选项)
private void btn_Writefile_Click(object sender, EventArgs e)
{
switch (put_comboBox.SelectedIndex)
{
case 0:
output_TH_processing(); break;
case 1:
output_HW_processing(); break;
case 2:
output_TH_HW_processing(); break;
}
try
{
if (!File.Exists(@"E:\监测数据.txt"))
{
FileStream fs = new FileStream(@"E:\监测数据.txt", FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
long fl = fs.Length;
fs.Seek(fl, SeekOrigin.End);
sw.WriteLine(output);//开始写入值
sw.Close();
fs.Close();
MessageBox.Show("输出成功!请在E盘根目录下查看!");
}
else
{
FileStream fs = new FileStream(@"E:\监测数据.txt", FileMode.Open, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
long fl = fs.Length;
fs.Seek(fl, SeekOrigin.Begin);
sw.WriteLine(output + "\n\n");//开始写入值
sw.Close();
fs.Close();
MessageBox.Show("输出成功!请在E盘根目录下查看!");
}
}
catch (Exception ex)
{
MessageBox.Show("错误信息:" + ex.Message + "!");
}
}
每个case的函数(不同小异,格式不一样,大家可以按照需求修改):
private void output_TH_HW_processing()
{
try
{
output = "";
double T_average = 0;
double H_average = 0;
int k = 1;
output = DateTime.Now.ToLocalTime().ToString() + "--最近六次的温湿度监测:\r\n";
double[] T_list = T_dataQueue.ToArray();
double[] H_list = H_dataQueue.ToArray();
foreach (double i in T_list)
{
T_average += i;
output += "第" + k + "次温度是:" + i + "°C" + "\r\n";
++k;
}
output += "平均温度是:" + Math.Round(T_average / 6.0, 2) + "°C" + "\r\n" + "\r\n";
k = 1;
foreach (double i in H_list)
{
H_average += i;
output += "第" + k + "次湿度是:" + i + "%" + "\r\n";
++k;
}
output += "平均湿度是:" + Math.Round(H_average / 6.0, 2) + "%" + "\r\n";
output += "\r\n红外监测数据:\r\n";
output += "红外测距:" + distances_label.Text.ToString() + ",红外感应:" + HW_Label.Text.ToString() + "。\r\n";
}
catch (Exception ex)
{
MessageBox.Show("output_txt:" + ex.Message + "!");
}
}
private void output_TH_processing()
{
try {
double T_average = 0;
double H_average = 0;
int k = 1;
output = "";
output=DateTime.Now.ToLocalTime().ToString()+ "--最近六次的温湿度监测:\r\n";
double [] T_list= T_dataQueue.ToArray();
double[] H_list = H_dataQueue.ToArray();
foreach (double i in T_list)
{
T_average += i;
output += "第" + k + "次温度是:" + i + "°C" + "\r\n";
++k;
}
output += "平均温度是:" + Math.Round(T_average / 6.0, 2) + "°C" + "\r\n"+ "\r\n";
k = 1;
foreach (double i in H_list)
{
H_average += i;
output += "第" + k + "次湿度是:" + i + "%" + "\r\n";
++k;
}
output += "平均湿度是:" + Math.Round(H_average / 6.0, 2) + "%" + "\r\n";
}
catch (Exception ex)
{
MessageBox.Show("output_txt:" + ex.Message + "!");
}
}
private void output_HW_processing()
{
try
{
output = "";
output = DateTime.Now.ToLocalTime().ToString() + "--感应监测数据:\r\n";
output += "超声波测距:"+ distances_label.Text.ToString()+",红外感应:"+ HW_Label.Text.ToString()+ "。\r\n";
}
catch (Exception ex)
{
MessageBox.Show("output_txt:" + ex.Message + "!");
}
}
下面这个是保存表格截图的代码:
private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog save_pic = new SaveFileDialog();
save_pic.Filter = "Bitmap (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg|PNG (*.png)|*.png|SVG (*.svg)|*.svg";
save_pic.FilterIndex = 2;
save_pic.RestoreDirectory = true;
// Set image file format
if (save_pic.ShowDialog() == DialogResult.OK)
{
ChartImageFormat format = ChartImageFormat.Bmp;
if (save_pic.FileName.EndsWith("bmp"))
{
format = ChartImageFormat.Bmp;
}
else if (save_pic.FileName.EndsWith("jpg"))
{
format = ChartImageFormat.Jpeg;
}
else if (save_pic.FileName.EndsWith("png"))
{
format = ChartImageFormat.Png;
}
// Save image
chart1.SaveImage(save_pic.FileName, format);
}
}
到这里整个上位机的功能构建就完成了。