抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
最近学习C#,看到一个通过串口发指令控制下位机开关状态的小样例,对学习练习的过程做了记录。
1、实现功能简介
本案例实现功能包括:
1、刷新串口功能:通过点击刷新串口,可以将可使用的COM口添加到下拉菜单;
2、打开串口功能:通过点击打开串口按钮,可以打开下拉框选中的COM口,并将文本改成关闭串口,再次点击则能关闭相应串口;
3、点击各通道的开关按钮,通过打开的串口发出不同的指令,从而实现相应的动作;
2、界面设计
2.1、主界面样式
1.png
2.2、添加控件及属性设置
2.png
串口设置部分
3.png
通道1部分
4.png
通道2部分
5.png
通道3部分
6.png

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”;
7.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码