【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码
广东职业技术学院 欧浩源
一、需求分析
按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体需求详见《【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-题目需求》。
二、界面设计
三、程序源码分析
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.Threading; using System.IO.Ports; namespace 基础技能综合实训_基础版_ { public partial class Form1 : Form { public Form1() { InitializeComponent(); } SerialPort com = new SerialPort(); //实例化一个串口对象 byte[] SendData = new byte[8]; //定义一个8字节的发送数据缓存 byte[] readBuffer = new byte[8]; //实例化接收串口数据的数组 private void Form1_Load(object sender, EventArgs e) { string[] ports = { "COM1", "COM2", "COM3", "COM4", "COM5" }; foreach (string str in ports) { comboBox1.Items.Add(str); } comboBox1.SelectedIndex = 2; string[] baudrate = { "2400", "4800", "9600", "19200", "57600", "115200" }; foreach (string str in baudrate) { comboBox2.Items.Add(str); } comboBox2.SelectedIndex = 2; comboBox3.Items.Add("6"); comboBox3.Items.Add("7"); comboBox3.Items.Add("8"); comboBox3.SelectedIndex = 2; comboBox4.Items.Add("1"); comboBox4.Items.Add("1.5"); comboBox4.Items.Add("2"); comboBox4.SelectedIndex = 0; comboBox5.Items.Add("None"); comboBox5.SelectedIndex = 0; button2.Enabled = false; button3.Enabled = false; button4.Enabled = false; textBox1.ReadOnly = true; label14.Text = "终端未连接"; label14.ForeColor = Color.Red; label9.Text = "0.00" + " V"; label9.ForeColor = Color.Blue; label12.Text = ""; label13.Text = ""; label7.Text = "串口未连接!"; label7.ForeColor = Color.Red; com.ReceivedBytesThreshold = 8; //设置串口接收到8个字节数据才触发DataReceived事件 //为串口DataReceived事件添加处理方法 com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); } //串口数据接收DataReceived事件触发处理方法 private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { string strRcv = ""; int count = com.BytesToRead; //获取串口缓冲器的字节数 if (count != 8) { return; } com.Read(readBuffer, 0, 8); //从串口缓冲区读出数据到数组 com.DiscardInBuffer(); for (int i = 0; i < readBuffer.Length; i++) { strRcv += readBuffer[i].ToString("X2") + " "; //16进制显示 } this.BeginInvoke(new Action(() => { textBox1.Text = strRcv; })); if (readBuffer[0] == 0xAF && readBuffer[7] == 0xFA) //判断数据的帧头和帧尾 { this.BeginInvoke(new Action(() => { switch (readBuffer[2]) { case 0x10: label14.Text = string.Format("{0}号终端在线", readBuffer[1]); label14.ForeColor = Color.Green; button4.Enabled = false; button2.Enabled = true; button3.Text = "打开照明灯"; button2.Text = "开始采集数据"; label12.Text = "关闭"; label12.ForeColor = Color.Red; label13.Text = "关闭"; label13.ForeColor = Color.Red; break; case 0x11: Int32 ad = readBuffer[3]; double advalue; ad <<= 8; ad |= readBuffer[4]; //从数据帧中将电压数据取出 advalue = ad; advalue = (advalue * 3.3) / 32768; //将数据换算为实际的电压值 label9.Text = advalue.ToString("F2") + " V"; if ((readBuffer[5] & 0x01) == 0x01) { label12.Text = "打开"; label12.ForeColor = Color.Blue; button3.Text = "关闭照明灯"; } else { label12.Text = "关闭"; label12.ForeColor = Color.Red; button3.Text = "打开照明灯"; } if ((readBuffer[5] & 0x02) == 0x02) { label13.Text = "打开"; label13.ForeColor = Color.Blue; } else { label13.Text = "关闭"; label13.ForeColor = Color.Red; } break; case 0x1f: label14.Text = "现场报警!!!"; label14.ForeColor = Color.Red; button4.Enabled = true; button2.Enabled = false; button3.Enabled = false; break; } // com.DiscardInBuffer(); })); } } private void button1_Click(object sender, EventArgs e) { if (button1.Text == "打开串口") { com.PortName = comboBox1.Text; //选择串口号 com.BaudRate = int.Parse(comboBox2.Text); //选择波特率 com.DataBits = int.Parse(comboBox3.Text); //选择数据位数 com.StopBits = (StopBits)int.Parse(comboBox4.Text); //选择停止位数 com.Parity = Parity.None; //选择是否奇偶校验 try { if (com.IsOpen) //判断该串口是否已打开 { com.Close(); com.Open(); } else { com.Open(); } label7.Text = "串口已成功连接!"; label7.ForeColor = Color.Blue; } catch (Exception ex) { MessageBox.ReferenceEquals("错误:" + ex.Message, "串口通信"); } button1.Text = "关闭串口"; } else if (button1.Text == "关闭串口") { com.Close(); //关闭串口 label7.Text = "串口未连接!"; label14.Text = "终端未连接"; label14.ForeColor = Color.Red; label7.ForeColor = Color.Red; button1.Text = "打开串口"; button2.Enabled = false; button3.Enabled = false; button4.Enabled = false; textBox1.Clear(); } } private void SendUartData() { SendData[0] = 0xAF; SendData[3] = 0x00; SendData[4] = 0x00; SendData[5] = 0x00; SendData[6] = 0x00; SendData[7] = 0xFA; for (int i = 1; i < 7; i++) { SendData[6] += SendData[i]; } com.Write(SendData, 0, 8); } private void button2_Click(object sender, EventArgs e) { if (button2.Text == "开始采集数据") { button2.Text = "停止采集数据"; button3.Enabled = true; SendData[1] = 0x01; SendData[2] = 0x01; SendUartData(); } else { button2.Text = "开始采集数据"; button3.Enabled = false; SendData[1] = 0x01; SendData[2] = 0x02; SendUartData(); } } private void button3_Click(object sender, EventArgs e) { if (button3.Text == "打开照明灯") { button3.Text = "关闭照明灯"; SendData[1] = 0x01; SendData[2] = 0x03; SendUartData(); } else { button3.Text = "打开照明灯"; SendData[1] = 0x01; SendData[2] = 0x04; SendUartData(); } } private void button4_Click(object sender, EventArgs e) { SendData[1] = 0x01; SendData[2] = 0x0f; SendUartData(); } } }