上位机+xml

单片机课设要求做一个温度传感报警系统,我做了一个对应的上位机,有基本的串口设置、接收,二进制发送,十六进制发送等串口基本功能,同时运用了xml文件保存上一次设置的参数,在下一次打开时自动添加。相关的网络文档可以参考

1、http://blog.csdn.net/wuyazhe/article/category/69509   有5篇比较详实的关于串口通讯的

2、http://wenku.baidu.com/link?url=jQOzZ7Blt132wU__3h0hZDYzQaZYcypmcI-0gR523n3Iafld56aH4qzL2G-zmXgK1BJWrGgKni-H7-6RhucGijWZ67nriDoniIMtplTNX5a   关于委托的一个例子

界面如下

 

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text.RegularExpressions;
using System.Xml;
using System.IO;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /*
         * 串口配置初始化,能够自动获取当前可用的串口,和上次加载的波特率,温度上下限设置等
         * 文件名是set.xml
         */ 
        private void Form1_Load(object sender, EventArgs e)
        {
            combo_portrate.Items.Add("4800");
            combo_portrate.Items.Add("9600");
            //combo_portrate.SelectedIndex = 0;
            string[] sPortname = SerialPort.GetPortNames();
            for (int i = 0; i < sPortname.Length; i++)
            {
                combo_portname.Items.Add(sPortname[i]);
            }
            //combo_portname.SelectedIndex = 0;    
            XmlDocument doc = new XmlDocument();
            doc.Load("set.xml");
            XmlElement rootElem = doc.DocumentElement;
            XmlNodeList shuxingNodes = rootElem.GetElementsByTagName("shuxing");
            foreach (XmlNode node in shuxingNodes)
            {
                string strName = ((XmlElement)node).GetAttribute("name");
                if (strName.Equals("chuankou"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("com");
                    string state = subAgeNodes[0].InnerText;
                    combo_portname.SelectedIndex = Convert.ToInt32(state);
                    subAgeNodes = ((XmlElement)node).GetElementsByTagName("rate");
                    state = subAgeNodes[0].InnerText;
                    combo_portrate.SelectedIndex = Convert.ToInt32(state);
                }
                else if (strName.Equals("parameter"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("min");
                    string state = subAgeNodes[0].InnerText;
                    textBox_tempmin.Text = state;
                    subAgeNodes = ((XmlElement)node).GetElementsByTagName("max");
                    state = subAgeNodes[0].InnerText;
                    textBox_temp_max.Text = state;
                    subAgeNodes = ((XmlElement)node).GetElementsByTagName("rate");
                    state = subAgeNodes[0].InnerText;
                    textBox_ratechange.Text = state;
                }
            }
       }
        /*
         * 打开、关闭串口
         */
        private void but_openclose_Click(object sender, EventArgs e)
        {
            if (but_openclose.Text == "打开串口")
            {
                if (combo_portname.Text != "")
                {
                    serialPort1.PortName = combo_portname.Text;
                    serialPort1.BaudRate = Convert.ToInt32(combo_portrate.Text);
                    serialPort1.Open();
                    but_openclose.Text = "关闭串口";
                }
                else
                {
                    MessageBox.Show("error!");
                }
            }
            else if (but_openclose.Text == "关闭串口")
            {
                but_openclose.Text = "打开串口";
                serialPort1.Close();
            }
            else
            {
                MessageBox.Show("error!");
            }
        }
        /*
         * 串口接收并处理
         * 这里用到了委托 关于委托的使用可以参照上文给出的网页
         */ 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int n = serialPort1.BytesToRead;
            byte[] buf = new byte[n];
            serialPort1.Read(buf, 0, n);
            string text = Encoding.Default.GetString(buf, 0, n);
            this.Invoke(
                (EventHandler)
                (delegate
                {
                    textBox_receive.Clear();
                    textBox_receive.AppendText(text);
                    if (text.Contains("-"))
                    {
                        string[] sArray = Regex.Split(text, "-", RegexOptions.IgnoreCase);
                        lab_temp1.Text = sArray[1][0].ToString() + sArray[1][1].ToString() + sArray[1][2].ToString() + "." + sArray[1][3].ToString();
                        if (sArray[2].Equals("0"))
                        {
                            lab_warning.Text = "NO";
                        }
                        else
                        {
                            lab_warning.Text = "YES";
                        }
                    }
                    else
                    {
                        lab_warning.Text = "未知";
                        lab_temp1.Text = "未知";
                    }
                }));
        }
        /*
         * 以下为改变参数中在xml中自动修改
         */ 
        private void combo_portrate_SelectedIndexChanged(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("set.xml");
            XmlElement rootElem = doc.DocumentElement;
            XmlNodeList shuxingNodes = rootElem.GetElementsByTagName("shuxing");
            foreach (XmlNode node in shuxingNodes)
            {
                string strName = ((XmlElement)node).GetAttribute("name");
                if (strName.Equals("chuankou"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("rate");
                    subAgeNodes[0].InnerText = combo_portrate.SelectedIndex.ToString();
                }
            }
            StreamWriter swriter = new StreamWriter("set.xml");
            XmlTextWriter xw = new XmlTextWriter(swriter);
            xw.Formatting = Formatting.Indented;
            doc.WriteTo(xw);
            xw.Close();
            swriter.Close();
        }

        private void textBox_tempmin_TextChanged(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("set.xml");
            XmlElement rootElem = doc.DocumentElement;
            XmlNodeList shuxingNodes = rootElem.GetElementsByTagName("shuxing");
            foreach (XmlNode node in shuxingNodes)
            {
                string strName = ((XmlElement)node).GetAttribute("name");
                if (strName.Equals("parameter"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("min");
                    subAgeNodes[0].InnerText = textBox_tempmin.Text;
                }
            }
            StreamWriter swriter = new StreamWriter("set.xml");
            XmlTextWriter xw = new XmlTextWriter(swriter);
            xw.Formatting = Formatting.Indented;
            doc.WriteTo(xw);
            xw.Close();
            swriter.Close();
        }

        private void textBox_temp_max_TextChanged(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("set.xml");
            XmlElement rootElem = doc.DocumentElement;
            XmlNodeList shuxingNodes = rootElem.GetElementsByTagName("shuxing");
            foreach (XmlNode node in shuxingNodes)
            {
                string strName = ((XmlElement)node).GetAttribute("name");
                if (strName.Equals("parameter"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("max");
                    subAgeNodes[0].InnerText = textBox_temp_max.Text;
                }
            }
            StreamWriter swriter = new StreamWriter("set.xml");
            XmlTextWriter xw = new XmlTextWriter(swriter);
            xw.Formatting = Formatting.Indented;
            doc.WriteTo(xw);
            xw.Close();
            swriter.Close();
        }

        private void textBox_ratechange_TextChanged(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("set.xml");
            XmlElement rootElem = doc.DocumentElement;
            XmlNodeList shuxingNodes = rootElem.GetElementsByTagName("shuxing");
            foreach (XmlNode node in shuxingNodes)
            {
                string strName = ((XmlElement)node).GetAttribute("name");
                if (strName.Equals("parameter"))
                {
                    XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("rate");
                    subAgeNodes[0].InnerText = textBox_ratechange.Text;
                }
            }
            StreamWriter swriter = new StreamWriter("set.xml");
            XmlTextWriter xw = new XmlTextWriter(swriter);
            xw.Formatting = Formatting.Indented;
            doc.WriteTo(xw);
            xw.Close();
            swriter.Close();
        }
        /*
         * 改变波特率 用二进制发送 
         */
        private void button2_Click(object sender, EventArgs e)
        {
            string text = "0" + textBox_ratechange.Text+"00";
            //MessageBox.Show(text);
            int n = text.Length;
            char[] buf = new char[n];
            buf = text.ToCharArray();
            serialPort1.Write(buf, 0, n);
        }
        /*
         * 改变温度上下限 用二进制发送
         */ 
        private void button3_Click(object sender, EventArgs e)
        {
            string sHour = DateTime.Now.Hour.ToString();
            if (Convert.ToInt32(sHour) < 10)
            {
                sHour = "0" + sHour;
            }
            string sMin = DateTime.Now.Minute.ToString();
            if (Convert.ToInt32(sMin) < 10)
            {
                sMin = "0" + sMin;
            }
            string sSec = DateTime.Now.Second.ToString();
            if (Convert.ToInt32(sSec) < 10)
            {
                sSec = "0" + sSec;
            }
            string text = "2" + sHour + sMin + sSec;
            //MessageBox.Show(text);
            int n = text.Length;
            char[] buf = new char[n];
            buf = text.ToCharArray();
            serialPort1.Write(buf, 0, n);
        }
        /*
         * 改变时间 因为要求用1302时钟芯片,1302是BCD计数,所以用16进制发送
         */ 
        private void button1_Click(object sender, EventArgs e)
        {
            string text = "1" + textBox_tempmin.Text+textBox_temp_max.Text+"00";
            //MessageBox.Show(text);
            int n = text.Length;
            char[] buf = new char[n];
            buf = text.ToCharArray();
            serialPort1.Write(buf, 0, n);
        }
    }
}

工作起来长这个样子

posted on 2015-06-23 10:08  三天两疯  阅读(443)  评论(0)    收藏  举报

导航