C#winform小demo-串口传输实现硬件数据回传(数据处理/输出txt文件保存)

这节主要介绍通过串口接收回来的数据,我是如何处理的。

首先跟负责硬件的同学约定好格式,首个字母作为标志,判断是哪一个数据,然后利用字符:和@约定为数据,然后裁剪出来,就获得了数据。

话不多说,上代码( 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);
            }
        }

 

到这里整个上位机的功能构建就完成了。 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值