【C# 上位机】C#上位机之多编辑框输出

来源:互联网 发布:crm软件系统功能 编辑:程序博客网 时间:2024/06/05 19:46

背景:*基于zigbee的农业温室大棚

功能:接收多个zigbee终端结点传输到串口的数据,并将数据进行分析,调用不同的编辑框进行输出

本博文类似上篇:”串口通信之多个编辑框输出“  可参考上篇思路

 首先,每个zigbee的数据必须打包,且定长,如:12个字节

           comm.ReceivedBytesThreshold = 11;//这里我设置了触发字节数是11.  可以自己设置。

    ##意思就是,每当接收缓冲区接收到完整的11个字节大小数据的时候,就会触发DataReceived()函数。

    ##这样很巧妙的解决的数据显示错乱的问题,使每个zigbee终端的数据按照自己的设想显示在不同的编辑框中

    ##       C#写上位机  比用C++的MFC 简便很多,会用FMC的串口通信,C#上手很快的。

             直接上关键代码吧:

 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)//####
        {   
            int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
            received_count += n;//增加接收计数
            comm.Read(buf, 0, n);//读取缓冲数据
            builder.Clear();//清除字符串构造器的内容
            //因为要访问ui资源,所以需要使用invoke方式同步ui。
            this.Invoke((EventHandler)(delegate
            {
                //判断是否是显示为16禁止
                if (checkBoxHexView.Checked)
                {
                    //依次的拼接出16进制字符串
                    foreach (byte b in buf)
                    {
                        builder.Append(b.ToString("X2") + " ");
                    }
                }
                else
                {
                    //直接按ASCII规则转换成字符串
                    builder.Append(Encoding.ASCII.GetString(buf));
                }
                //
                //########        数据包   分析
                //
                byte h=0;
                String str1 = builder.ToString();  //   通过分析缓冲区接收到的数据包的首字符,
                if (str1[0] == '*')
                { h = 0; }
                else if (str1[0] == '&')
                { h = 1; }
                else if (str1[0] == '#')
                { h = 2; }
                else if (str1[0] == '!')
                { h = 3; }
               switch(h)
                {
                    case 0: this.txGet2.AppendText(str1);//这里就是把 首字符是 * 的数据包中的数据加到编辑框txGet2中(下面一样的方式)
                        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\DATA_CHECK\C#_Humidity.txt", true))//参数true 为追加
                        {
                           string time= DateTime.Now.ToString();
                            file.WriteLine(time+" 湿度: "+str1);// 直接追加文件末尾,换行  
                        }
                        break;
                    case 1: this.txGet.AppendText(str1);
                        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\DATA_CHECK\C#_smoke.txt", true))
                        {
                            string time1 = DateTime.Now.ToString();
                            file.WriteLine(time1+" 烟雾: "+str1);// 直接追加文件末尾,换行  
                        }
                        break;
                    case 2:
                        this.txGet_temp.AppendText(str1+"    ");
                        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\DATA_CHECK\C#_temp.txt", true))
                        {
                            string time2 = DateTime.Now.ToString();
                            file.WriteLine(time2 + " 温度: " + str1);// 直接追加文件末尾,换行  
                        }
                        break;
                    case 3:
                        this.txGet_light.AppendText(str1+"  ");
                        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\DATA_CHECK\C#_light.txt", true))
                        {
                            string time3 = DateTime.Now.ToString();
                            file.WriteLine(time3 + " 光照: " + str1);// 直接追加文件末尾,换行  
                        }
                        break;
                }
               
                //追加的形式添加到文本框末端,并滚动到最后。
                //修改接收计数


                labelGetCount.Text = "Get:" + received_count.ToString();//窗口 计算接收到 的数据字节个数 方便判定数据的完整性
            }));
            received_count = 0;
        }

下面是效果图(下面版权声明纯属娱乐下,哈哈)


1 0
原创粉丝点击