|
最近学习C#,看到一个通过串口发指令控制下位机开关状态的小样例,对学习练习的过程做了记录。 1、实现功能简介 本案例实现功能包括: 1、刷新串口功能:通过点击刷新串口,可以将可使用的COM口添加到下拉菜单; 2、打开串口功能:通过点击打开串口按钮,可以打开下拉框选中的COM口,并将文本改成关闭串口,再次点击则能关闭相应串口; 3、点击各通道的开关按钮,通过打开的串口发出不同的指令,从而实现相应的动作; 2、界面设计 2.1、主界面样式 2.2、添加控件及属性设置 串口设置部分 通道1部分 通道2部分 通道3部分 3、代码实现和分析 3.1、创建SearchAndAddSerialToComboBox函数 创建函数,实现遍历可用串口功能,代码如下: private void SearchAndAddSerialToComboBox(SerialPort MyPort,ComboBox MyBox) { //将可用端口号添加到ComBox string[] MyString = new string[20]; //最多容纳20个,太多会影响调试效率 string Buffer; //缓存 MyBox.Items.Clear(); //清空ComboBox内容 for (int i=1;i<20;i++) //循环 { try //核心原理是依靠try和catch完成遍历 { Buffer = "COM" + i.ToString(); MyPort.PortName = Buffer; MyPort.Open(); //如果失败,后面的代码不会执行 MyString[i - 1] = Buffer; MyBox.Items.Add(Buffer); //打开成功,添加至下拉列表 MyPort.Close(); //关闭 } catch { } } MyBox.Text = MyString[0]; //初始化 } 3.2、打开串口按钮代码 该段代码实现串口的打开和关闭,代码如下: private void btnOpenCOM_Click(object sender, EventArgs e) { if(serialPort1.IsOpen) //串口打开就关闭 { try { serialPort1.Close(); } catch { } btnOpenCOM.Text = "打开串口"; } else { try { serialPort1.PortName = cbxCOMPort.Text; //端口号 serialPort1.Open(); //打开端口 btnOpenCOM.Text = "关闭串口"; } catch { MessageBox.Show("串口打开失败", "错误提示"); } } } 3.3、主要代码 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;namespace L029_SerialControl{ public partial class Form1 : Form { //通道1 const byte DeviceOpen1 = 0x01; const byte DeviceClose1 = 0x81; //SerialPort Write Buffer byte[] SerialPortDataBuffer = new byte[1]; public Form1() { InitializeComponent(); } private void WriteByteToSerialPort(byte data) //单字节写入串口 { byte[] Buffer = new byte[2] { 0x00, data }; //定义数组 if(serialPort1.IsOpen) //传输数据的前提是端口已打开 { try { serialPort1.Write(Buffer, 0, 2); //写数据 } catch { MessageBox.Show("串口数据发送出错,请检查","错误"); //错误处理 } } } private void Form1_Load(object sender, EventArgs e) { SearchAndAddSerialToComboBox(serialPort1,cbxCOMPort); } //发送通道1开指令 private void btnOpen1_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceOpen1); } //发送通道1关指令 private void btnClose1_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceClose1); } //发送通道2开指令 private void btnOpen2_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceOpen2); } //发送通道2关指令 private void btnClose2_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceClose2); } //发送通道3开指令 private void btnOpen3_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceOpen3); } //发送通道3关指令 private void btnClose3_Click(object sender, EventArgs e) { WriteByteToSerialPort(DeviceClose3); } }}
4、测试 通过虚拟串口和串口助手测试程序: 通道1:点击“开”发出“00 01”;点击“关”发出“00 81”; 通道2:点击“开”发出“00 02”;点击“关”发出“00 82”; 通道3:点击“开”发出“00 02”;点击“关”发出“00 83”; 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |