基本信息
源码名称:C#温湿度上位机软件源码
源码大小:0.56M
文件格式:.zip
开发语言:C#
更新时间:2018-11-28
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 2 元 
   源码介绍
C#温湿度上位机软件,可显示温度曲线



using ControlPoxy;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ZedGraph;

namespace OpenSoftware
{
    public partial class mainWindows : Form
    {
        float sht2x_temp, sht2x_hum;
        int receiveIndex = -1;
        bool b_UploadEnable = false;
        bool b_buttonCtrl = false;
        Thread dataHandler;
        private String ComPort = "COM1";
        string[] StringBaud = { "115200", "57600", "38400", "19200", "9600", "4800", "2400" };  //串口波特率设置

        Util_Proxy st_unit = new Util_Proxy();
        private ControlPoxy.MCS_Protocol st_MCS_Protocol = new ControlPoxy.MCS_Protocol();
        ControlPoxy.Serial_Proxy st_Serial_Proxy = new ControlPoxy.Serial_Proxy();
        ControlPoxy.CRC_Proxy st_CRC_Proxy = new ControlPoxy.CRC_Proxy();

        PointPairList list1;
        PointPairList list2;
        public mainWindows()
        {
            InitializeComponent();
        }

        private void mainWindows_Load(object sender, EventArgs e)
        {
            int baudIndex = 0;
            string[] port = System.IO.Ports.SerialPort.GetPortNames();//搜索PC可用的串口号 

            if (port != null)
            {
                comboBox_ComPort.Items.Clear();
                foreach (string cName in port)
                {
                    comboBox_ComPort.Items.Add(cName);
                    if (cName == ComPort)
                    {
                        comboBox_ComPort.SelectedIndex = baudIndex;
                    }
                    baudIndex  ;
                }
            }

            Control.CheckForIllegalCrossThreadCalls = false;
            //波特率
            comboBox_Baud.Items.Clear();
            foreach (string cName in StringBaud)
            {
                comboBox_Baud.Items.Add(cName);
            }
            comboBox_Baud.SelectedIndex = 0;

            dataHandler = new Thread(DataCommandHander);
            dataHandler.Start();

            tools_cypyRight.Text = st_unit.CopyRight;
            tools_version.Text = st_unit.SoftVersion;

            toolsTime_build.Text = "Building: "   System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location).ToString("F");
            textBox_DataLen.Text = "10";
            button_CtrlSht2x.Text = "Start";

            list1 = new PointPairList();
            list2 = new PointPairList();
            CreateGraph(zedGraphControl);
            //SetSize();
        }

        private void DataCommandHander()
        {
            Boolean b_res = false;

            while (true)
            {
                if (st_Serial_Proxy.b_SerialReceiveReady)
                {
                    st_Serial_Proxy.b_SerialReceiveReady = false;
                    if (st_Serial_Proxy.DataLength > 0)
                    {
                        if (st_Serial_Proxy.RtBuff[0] == 0x5b)
                        {
                            b_res = st_MCS_Protocol.MCS_ProtocolPaeser(st_Serial_Proxy.RtBuff);
                            if (b_res)
                            {
                                Mcs_ReceiveAndSendMonitor(st_MCS_Protocol, true);
                                st_MCS_Protocol.b_result = true;
                                Parser_Sht2xValue();
                            }
                        }
                        st_Serial_Proxy.DataLength = 0;
                    }
                }
            }         
        }

        private void Mcs_ReceiveAndSendMonitor(MCS_Protocol mcs, bool mode)
        {
            byte[] buff = new byte[512];
            int length = 0;

            if (mode == true)
                richTextBox_Monitor.AppendText("Recv:"   "\r\n");
            else
                richTextBox_Monitor.AppendText("Send:"   "\r\n");

            length = mcs.MCS_Building(mcs.srcAddr, mcs.tarAddr, mcs.Frum, mcs.CMD, mcs.DataBuf, (byte)mcs.DataLen, buff);
            Monitor_Display(buff, length);
        }

        private void mainWindows_FormClosed(object sender, FormClosedEventArgs e)
        {
            st_Serial_Proxy.SerialPort_Stop();
            dataHandler.Abort();
            Application.Exit();
        }

        private void button_CommCtrl_Click(object sender, EventArgs e)
        {
            st_Serial_Proxy.Baud = int.Parse(comboBox_Baud.Text);    //设置Baud
            st_Serial_Proxy.Comport = comboBox_ComPort.Text;         //获取端口号
            st_Serial_Proxy.Parity = System.IO.Ports.Parity.None;
            st_Serial_Proxy.TimeOut = 300;

            if (b_buttonCtrl == false)
            {
                button_CommCtrl.Text = "关闭串口";
                b_buttonCtrl = true;
                st_Serial_Proxy.SerialPort_Start();
                comboBox_Baud.Enabled = false;
                comboBox_ComPort.Enabled = false;
            }
            else
            {
                button_CommCtrl.Text = "打开串口";
                b_buttonCtrl = false;
                st_Serial_Proxy.SerialPort_Stop();
                comboBox_Baud.Enabled = true;
                comboBox_ComPort.Enabled = true;
            }
        }

        private void button_ClearBuff_Click(object sender, EventArgs e)
        {
            richTextBox_Monitor.Clear();
        }

        private void ShowMessage(string msg)
        {
            richTextBox_Monitor.AppendText(msg);
        }

        private void Monitor_Display(byte[] data, int length)
        {
            if (length > 0)
            {
                string s = "";
                for (int i = 0; i < length; i  )
                {
                    s  = data[i].ToString("X2");
                    s  = " ";
                }
                richTextBox_Monitor.AppendText(s   "\r\n");
            }
        }

        private void CtrCmd_McsBuiding(MCS_Protocol mcs)
        {
            byte[] buff = new byte[256];
            int length = 0;

            length = mcs.MCS_Building(mcs.srcAddr, mcs.tarAddr, mcs.Frum, mcs.CMD, mcs.DataBuf, (byte)mcs.DataLen, buff);

            st_Serial_Proxy.SerialSend(buff, length);

            richTextBox_Monitor.AppendText("Send"   "\r\n");
            Monitor_Display(buff, length);
        }

        private byte DataIDConvert(string sID)
        {
            byte byteID = 0;

            try
            {
                if (sID == "")
                {
                    MessageBox.Show("请输入数据ID!");
                }
                byteID = Convert.ToByte(sID);
            }
            catch { }

            return byteID;
        }

        private void button_ProtocolSend_Click(object sender, EventArgs e)
        {
            byte DataLen = DataIDConvert(textBox_DataLen.Text);
            if (DataLen > 45)
            {
                DataLen = 45;
            }

            ShowMessage("通信协议包测试 \r\n");
            st_MCS_Protocol.srcAddr = 0;
            st_MCS_Protocol.tarAddr = 0;
            st_MCS_Protocol.Frum = 0;
            st_MCS_Protocol.CMD = 0x0010;
            st_MCS_Protocol.DataLen = DataLen;

            if (DataLen > 0)
            {
                for (int i = 0; i < DataLen; i  )
                {
                    st_MCS_Protocol.DataBuf[i] = (byte)(0x30   i);
                }
            }
            CtrCmd_McsBuiding(st_MCS_Protocol);
        }


        #region FileDownload

        private void DownlaodFile_CheckCmd()
        {
            if (st_MCS_Protocol.CMD == 0x8012)
            {
                receiveIndex = st_MCS_Protocol.Frum;
            }
        }
        private void MakePacket_ByMcs(ushort DataLen, byte[] data, ushort frum)
        {
            st_MCS_Protocol.srcAddr = 0;
            st_MCS_Protocol.tarAddr = 0;
            st_MCS_Protocol.Frum = frum;
            st_MCS_Protocol.CMD = 0x0012;
            st_MCS_Protocol.DataLen = DataLen;

            if (DataLen > 0)
            {
                for (int i = 0; i < DataLen; i  )
                {
                    st_MCS_Protocol.DataBuf[i] = data[i];
                }
            }
            CtrCmd_McsBuiding(st_MCS_Protocol);
        }


        byte[] AppBt;
        int totalPacket = 0;
        const int fwSendLen = 128;
        private void AddFile_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openbinFile = new OpenFileDialog();
                openbinFile.Filter = "下载文件|*.bin;*.hex;*.ZFP";
                if (openbinFile.ShowDialog() == DialogResult.OK)
                {
                    FileStream IniRead = new FileStream(openbinFile.FileName, FileMode.OpenOrCreate, FileAccess.Read);
                    filePath.Text = openbinFile.FileName;

                    if (IniRead.Length > 0)
                    {
                        AppBt = new byte[IniRead.Length];
                        IniRead.Read(AppBt, 0, AppBt.Length);      //读取app应用代码数据

                        totalPacket = AppBt.Length / fwSendLen;    //计算数据包总数
                        if (AppBt.Length % fwSendLen != 0)
                        {
                            totalPacket  = 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        bool b_fwStart = false;
        Thread sub = null;
        ushort sendFrum = 0;

        private void button_Start_Click(object sender, EventArgs e)
        {
            progressBar_download.Maximum = totalPacket;
            progressBar_download.Value = 0;
            FwProcessBar.Text = "0%";
            b_fwStart = true;
            sendFrum = 0;

            sub = new Thread(sendUpDataThreading);
            sub.IsBackground = true;
            sub.Start();

            button_Start.Enabled = false;
            AddFile.Enabled = false;
            button1_Stop.Enabled = true;
        }

        private void button1_Stop_Click(object sender, EventArgs e)
        {
            button_Start.Enabled = true;
            AddFile.Enabled = true;
            button1_Stop.Enabled = false;
            FwProcessBar.Text = "0%";

            receiveIndex = -1;
            sendFrum = 0;
            b_fwStart = false;
            sub.Abort();
        }

        private void sendUpDataThreading()
        {
            byte[] data = new byte[fwSendLen];
            byte readLen;

            while (true)
            {
                if (!b_fwStart)
                    return;

                if ((AppBt.Length - sendFrum * fwSendLen) >= fwSendLen)
                {
                    readLen = fwSendLen;
                }
                else
                {
                    readLen = (byte)(AppBt.Length - sendFrum * fwSendLen);
                }

                if (readLen > 0)
                {
                    Buffer.BlockCopy(AppBt, sendFrum * fwSendLen, data, 0, readLen);
                    try
                    {
                        MakePacket_ByMcs(readLen, data, sendFrum);
                        System.Threading.Thread.Sleep(350);
                        DownlaodFile_CheckCmd();
                    }
                    catch
                    {

                    }


                    FwProcessBar.Text = (Convert.ToDouble(sendFrum) / Convert.ToDouble(progressBar_download.Maximum) * 100).ToString("0.0")   "%";
                    if (sendFrum == receiveIndex)
                    {
                        sendFrum  ;
                    }
                    progressBar_download.Value = sendFrum;
                }

                //判断数据包是否发送完毕
                if (sendFrum == totalPacket)
                {
                    receiveIndex = -1;
                    FwProcessBar.Text = "100%";
                    sendFrum = 0;
                    b_fwStart = false;

                    button_Start.Enabled = true;
                    AddFile.Enabled = true;
                    button1_Stop.Enabled = false;
                    sub.Abort();
                    return;
                }
            }
        }

        #endregion

        private void button_RTC_Click(object sender, EventArgs e)
        {
            byte[] rtc = new byte[6];

            ShowMessage("时间同步 \r\n");
            rtc[0] = (byte)(DateTime.Now.Year - 2000);
            rtc[1] = (byte)(DateTime.Now.Month);
            rtc[2] = (byte)(DateTime.Now.Day);

            rtc[3] = (byte)(DateTime.Now.Hour);
            rtc[4] = (byte)(DateTime.Now.Minute);
            rtc[5] = (byte)(DateTime.Now.Second);

            st_MCS_Protocol.srcAddr = 0;
            st_MCS_Protocol.tarAddr = 0;
            st_MCS_Protocol.Frum = 0;
            st_MCS_Protocol.CMD = 0x0011;
            st_MCS_Protocol.DataLen = 6;

            for (int i = 0; i < rtc.Length; i  )
            {
                st_MCS_Protocol.DataBuf[i] = rtc[i];
            }
            CtrCmd_McsBuiding(st_MCS_Protocol);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int intervalVal = 0;
            byte[] interval = new byte[2];

            if (b_UploadEnable)
            {
                b_UploadEnable = false;
                button_CtrlSht2x.Text = "Start";
            }
            else
            {
                b_UploadEnable = true;
                button_CtrlSht2x.Text = "Stop";
                intervalVal = 1;
            }

            interval[0] = (byte)(intervalVal >> 8);
            interval[1] = (byte)(intervalVal);

            st_MCS_Protocol.srcAddr = 0;
            st_MCS_Protocol.tarAddr = 0;
            st_MCS_Protocol.Frum = 0;
            st_MCS_Protocol.CMD = 0x0013;
            st_MCS_Protocol.DataLen = 2;

            for (int i = 0; i < interval.Length; i  )
            {
                st_MCS_Protocol.DataBuf[i] = interval[i];
            }
            CtrCmd_McsBuiding(st_MCS_Protocol);
        }

        private void Parser_Sht2xValue()
        {
            if (st_MCS_Protocol.CMD == 0x8013 && b_UploadEnable )
            {
                if (st_MCS_Protocol.DataLen == 4)
                {
                    sht2x_temp = st_MCS_Protocol.DataBuf[0] << 8 | st_MCS_Protocol.DataBuf[1];
                    sht2x_hum = st_MCS_Protocol.DataBuf[2] << 8 | st_MCS_Protocol.DataBuf[3];

                    textBox_temp.Text = (sht2x_temp*0.01).ToString();
                    textBox_hum.Text = (sht2x_hum*0.01).ToString();

                    DateTime now = DateTime.Now;
                    double x = (double)new XDate(now);


                    list1.Add(x, sht2x_temp * 0.01);
                    list2.Add(x, sht2x_hum * 0.01);

                    if (list1.Count >= 120)
                    {
                        list1.RemoveAt(0);
                    }
                    if (list2.Count >= 120)
                    {
                        list2.RemoveAt(0);
                    }
                    this.zedGraphControl.GraphPane.XAxis.Title.Text = "Time ("   zedGraphControl.GraphPane.XAxis.Scale.Format   ")";
                    this.zedGraphControl.AxisChange();
                    this.zedGraphControl.Refresh();
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

        }

        private void SetSize()
        {
            zedGraphControl.Location = new Point(10, 50);
            // Leave a small margin around the outside of the control
            zedGraphControl.Size = new Size(ClientRectangle.Width - 20,
                                    ClientRectangle.Height - 30);
        }

        private void CreateGraph(ZedGraphControl zgc)
        {
            zgc.IsShowPointValues = true;

            // get a reference to the GraphPane
            GraphPane myPane = zgc.GraphPane;

            // Set the Titles
            myPane.Title.Text = "SHT 20 温湿度监控";
            myPane.YAxis.Title.Text = "温度";
            myPane.Y2Axis.Title.Text = "湿度";
            myPane.YAxis.Title.FontSpec.Size = 12;
            myPane.Y2Axis.Title.FontSpec.Size = 12;
            myPane.YAxis.Scale.FontSpec.Size = 10;//设置y轴的文字大小.
            myPane.Y2Axis.Scale.FontSpec.Size = 10;//设置y轴的文字大小.
            myPane.XAxis.MajorGrid.IsVisible = true;//设置x轴虚线.
            myPane.YAxis.MajorGrid.IsVisible = true;//设置Y轴虚线.
            myPane.Y2Axis.MajorGrid.IsVisible = true;//设置Y轴虚线.

            myPane.XAxis.Title.Text = "时间";
            myPane.XAxis.Type = AxisType.DateAsOrdinal;
            myPane.XAxis.Scale.FormatAuto = true;
            myPane.XAxis.Scale.Format = "hh:mm:ss";
            myPane.XAxis.Scale.MaxAuto = true;
            myPane.XAxis.Scale.FontSpec.Size = 10;//设置x轴的文字大小.

            myPane.Chart.Border.IsVisible = false;//图表区域的边框设置.
            myPane.Legend.IsVisible = false;      //图表的注释标签显示设置项目.

            // Generate a red curve with diamond
            // symbols, and "Porsche" in the legend
            LineItem myCurve = myPane.AddCurve("温度",
                  list1, Color.Red, SymbolType.None);
            myCurve.Symbol.Fill = new Fill(Color.White);
            myCurve.Line.Width = 2;                  //设置线宽度

            // Generate a blue curve with circle
            // symbols, and "Piper" in the legend
            LineItem myCurve2 = myPane.AddCurve("湿度",
                  list2, Color.Blue, SymbolType.None);
            myCurve2.Symbol.Fill = new Fill(Color.White);
            myCurve2.Line.Width = 2;

            // Associate this curve with the Y2 axis
            myCurve2.IsY2Axis = true;
            // Associate this curve with the second Y2 axis
            myCurve2.YAxisIndex = 2;

            // Show the x axis grid
            myPane.XAxis.MajorGrid.IsVisible = true;

            // Make the Y axis scale red
            myPane.YAxis.Scale.FontSpec.FontColor = Color.Red;
            myPane.YAxis.Title.FontSpec.FontColor = Color.Red;
            // turn off the opposite tics so the Y tics don't show up on the Y2 axis
            myPane.YAxis.MajorTic.IsOpposite = false;
            myPane.YAxis.MinorTic.IsOpposite = false;
            // Don't display the Y zero line
            myPane.YAxis.MajorGrid.IsZeroLine = false;
            // Align the Y axis labels so they are flush to the axis
            myPane.YAxis.Scale.Align = AlignP.Inside;
            myPane.YAxis.Scale.Min = 0;
            myPane.YAxis.Scale.Max = 100;

            // Enable the Y2 axis display
            myPane.Y2Axis.IsVisible = true;
            // Make the Y2 axis scale blue
            myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Blue;
            myPane.Y2Axis.Title.FontSpec.FontColor = Color.Blue;
            // turn off the opposite tics so the Y2 tics don't show up on the Y axis
            myPane.Y2Axis.MajorTic.IsOpposite = false;
            myPane.Y2Axis.MinorTic.IsOpposite = false;
            // Display the Y2 axis grid lines
            myPane.Y2Axis.MajorGrid.IsVisible = true;
            // Align the Y2 axis labels so they are flush to the axis
            myPane.Y2Axis.Scale.Align = AlignP.Inside;
            myPane.Y2Axis.Scale.Min = 0;
            myPane.Y2Axis.Scale.Max = 100;

            // Fill the axis background with a gradient
            myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45.0f);

            // Tell ZedGraph to reconfigure the
            // axes since the data have changed
            zgc.AxisChange();
        }
    }
}