栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

【.net开发实战】物联网温湿度上报管理系统(二)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【.net开发实战】物联网温湿度上报管理系统(二)

往期1-3主题请参考:https://blog.csdn.net/weixin_41598714/article/details/107253548   温湿度上报管理系统 1.开发平台与背景 2.硬件准备 3.WPF登录界面开发 4.数据库开发 4.WPF上位机开发 5.ASP.net网页开发

 

往期进行了登录界面的设置,这篇将介绍对温湿度获取上位机以及上报数据库的主界面。

 

4.WPF上位机开发

界面展示

贴上界面代码


    
        
            
        
        
            
                
                

逻辑部分代码

using Modbus.Device;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO.Ports;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Visifire.Charts;
using Visifire.Commons;


namespace IntegratedPJ75
{
    /// 
    /// MainWindow.xaml 的交互逻辑
    /// 
    public partial class MainWindow : Window
    {
        //存储温湿度数据
        double temp = 0;
        double hum = 0;
        double num;
        private static IModbusMaster master;
        //写寄存器数组
        private ushort[] registerBuffer;
        //串口对象实例化
        SerialPort com = new SerialPort();

        public MainWindow()
        {
            InitializeComponent();
            //UserLogin userlogin = new UserLogin();
            //userlogin.Show();
            this.Loaded += MainWindow_Loaded;//添加窗体加载事件

        }





        /// 
        /// 窗体加载事件
        /// 
        /// 
        /// 
        Thread timer;//声明线程变量
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            //获取本机所以串口名字
            string[] strPortName = SerialPort.GetPortNames();
            //将本机所有串口名称赋值给cmbPort控件
            cmbPort.ItemsSource = strPortName;
            //下拉框初始化
            //如果本串口数量不为0,则将cmbPort的Item第一个索引
            if (strPortName.Length > 0) cmbPort.SelectedIndex = 0;
            //将波特率下拉框cmbBaudRate的Item第一个索引
            cmbBaudRate.SelectedIndex = 0;
            cmbDataBits.SelectedIndex = 0;
            cmbStopBits.SelectedIndex = 0;
            cmbParity.SelectedIndex = 0;

            CurveCtr.DrawBackground();//绘制背景
            BarCtr.DrawBackground();
            timer = new Thread(new ThreadStart(() => //线程实例化
            {
                while (true)
                {
                    try
                    {
                        Dispatcher.Invoke(new Action(() =>
                        {
                            CurveCtr.DrawLine(temp);//绘制温度折线
                            BarCtr.DrawLine(hum);//绘制温度直方图
                        }));

                    }
                    catch
                    {

                    }
                    Thread.Sleep(700);
                }
            }));
            timer.Start();
        }
        private void Windows_Closing_1(object sender, System.ComponentModel.CancelEventArgs e)
        {
            timer.Abort();//关闭线程
            timer = null;
        }
        /// 
        /// 打开按钮点击事件
        /// 
        /// 
        /// 
        private void btnOpen_Click_1(object sender, RoutedEventArgs e)
        {
            //如果按钮内容是“打开串口”则进行打开串口否则关闭串口操作
            if (btnOpen.Content.ToString() == "打开串口")
                //尝试打开,出错则在界面进行提示
                try
                {
                    //判断串口是否打开
                    if (!com.IsOpen)
                    {
                        //设置串口参数
                        com.PortName = cmbPort.Text;//串口号
                        com.BaudRate = int.Parse(cmbBaudRate.Text);//波特率
                        com.DataBits = int.Parse(cmbDataBits.Text);//数据位
                        switch (cmbStopBits.SelectedIndex)//停止位
                        {
                            case 0:
                                com.StopBits = StopBits.One; break;
                            case 1:
                                com.StopBits = StopBits.Two; break;
                            case 2:
                                com.StopBits = StopBits.OnePointFive; break;
                            case 3:
                                com.StopBits = StopBits.None; break;

                        }
                        switch (cmbParity.SelectedIndex)//奇偶检验
                        {
                            case 0: com.Parity = Parity.None; break;
                            case 1: com.Parity = Parity.Odd; break;
                            case 2: com.Parity = Parity.Even; break;

                        }
                        //设置串口参数
                        master = ModbusSerialMaster.CreateRtu(com);
                        com.Open();//打开串口
                    }
                    //设置按钮内容为关闭串口
                    btnOpen.Content = "关闭串口";
                    //界面显示信息“串口打开”
                    txtStaus.Text = "串口已打开!n";
                }
                catch
                {
                    txtStaus.Text = "串口打开错误或串口不存在!";

                }

            else //关闭串口
            {
                try
                {
                    if (com.IsOpen)
                    {
                        com.Close();//关闭串口
                    }
                    btnOpen.Content = "打开串口";
                    txtStaus.Text = "串口已关闭!";
                }
                catch
                {
                    txtStaus.Text = "串口关闭错误或串口不存在!";
                }

            }
        }
        private void BtnReceive_Click(Object sender, RoutedEventArgs e)
        {
            txtStaus.Clear();

            if (com.IsOpen == false)
            {
                txtStaus.AppendText("请打开串口!!!rn");
            }
            else
            {
                //读取数据



                registerBuffer = master.ReadHoldingRegisters(1, 0, 2);
                temp = registerBuffer[0] / 10.0;
                txtStaus.AppendText("温度:" + temp + " ");
                hum = registerBuffer[1] / 10.0;
                txtStaus.AppendText("湿度:" + hum + "tn");


            }


        }
        Chart chart;                                            // Chart object


        private void BtnSave_Click(object sender, RoutedEventArgs e)
        {
            string connString = @"Data Source=(localdb)ProjectsV13;Initial Catalog=MySchool;Integrated Security=True;Pooling=False;";
            try
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    conn.Open();//打开数据库连接
                    string sqlSel = String.Format("SELECT MAX(Id) FROM TempHumData");
                    SqlCommand commSel = new SqlCommand(sqlSel, conn); //创建command对象
                    //num全局变量,新增数据的Id编号
                    object i = commSel.ExecuteScalar();//add
                    if (!(commSel.ExecuteScalar() == System.DBNull.Value))
                    {
                        num = (int)commSel.ExecuteScalar();
                        num++;
                    }
                    else
                    {
                        num = 1;
                    }
                    //Sql语句,插入数据
                    string sqlIns = String.Format("INSERT INTO TempHumData(Id,time,temp,hum)" +
                        "VALUES('{0}','{1}','{2}','{3}')", num, DateTime.Now, temp, hum);
                    SqlCommand commIns = new SqlCommand(sqlIns, conn);//创建command对象
                    int n = commIns.ExecuteNonQuery();//执行添加命令,返回值为更新的行数
                    if (n > 0)
                    {
                        txtStaus.AppendText("数据保存成功!!!" + "rn");
                    }
                    else
                    {
                        txtStaus.AppendText("数据保存失败!!!" + "rn");
                    }
                }
            }
            catch (Exception ex)
            {

                txtStaus.AppendText(ex.Message + "rn");
            }
        }
    }
}

 注意:需要引用第三方的图形库Demo_3_4_WpfControlLibrary

下载地址:链接:https://pan.baidu.com/s/1sw3-MazR4hSXsJGjayJ1QA
提取码:yb09


至此WPF主界面已经完成,可以使用串口虚拟软件模拟数据运行。

下一节将开发APS.net网页数据管理端口。感兴趣可以查看第三章。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909589.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号