上位机+xml
单片机课设要求做一个温度传感报警系统,我做了一个对应的上位机,有基本的串口设置、接收,二进制发送,十六进制发送等串口基本功能,同时运用了xml文件保存上一次设置的参数,在下一次打开时自动添加。相关的网络文档可以参考
1、http://blog.csdn.net/wuyazhe/article/category/69509 有5篇比较详实的关于串口通讯的
界面如下
代码如下:
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); } } }
工作起来长这个样子
浙公网安备 33010602011771号