基于.Net C#通信开发-串口调试助手

1、概述

串口调试助手,广泛应用于工控领域的数据监控、数据采集、数据分析等工作,可以帮助串口应用设计、开发、测试人员检查所开发的串口应用软硬件的数据收发状况,提高开发的速度,成为您的串口应用的开发助手。
实全串口调试助手是绿色软件,只有一个执行文件,适用于各版本Windows操作系统,基于C# .Net 4.0 框架开发。可以在一台PC上同时启动多个串口调试助手(使用不同的COM口)。.

基于.Net C#通信开发-串口调试助手
  典型应用场合:通过串口调试助手与自行开发的串口程序或者串口设备进行通信联调。
  支持多串口,自动监测枚举本地可用串口;自由设置串口号、波特率、校验位、数据位和停止位等(支持自定义非标准波特率);
  支持ASCII/Hex两种模式的数据收发,发送和接收的数据可以UTF-8、16进制和AscII码之间任意转换;
  支持间隔发送,循环发送,批处理发送,输入数据可以从外部文件导入。

  串口调试开发,一般分为读取电脑连接串口信息、选择串口信息进行连接、设置相关发送接收配置、发送命令或消息,接收读取返回结果。

2、串口开发主要代码

2.1、读取电脑连接串口信息

串口调试,首先需要程序读取电脑连接串口信息。

//读取连接串口
            string[] mPortNames = SerialPort.GetPortNames();
            this.txtPortName.Items.Clear();
            foreach (var item in mPortNames)
            {
                this.txtPortName.Items.Add(item);
            }

            this.txtParity.Items.Clear();
            foreach (string item in Enum.GetNames(typeof(Parity)))
            {
                this.txtParity.Items.Add(item);
            }
            this.txtParity.DropDownStyle = ComboBoxStyle.DropDownList;

            this.txtStopBits.Items.Clear();
            foreach (string item in Enum.GetNames(typeof(StopBits)))
            {
                this.txtStopBits.Items.Add(item);
            }
            this.txtStopBits.DropDownStyle = ComboBoxStyle.DropDownList;

            this.txtHandshake.Items.Clear();
            foreach (string item in Enum.GetNames(typeof(Handshake)))
            {
                this.txtHandshake.Items.Add(item);
            }
            this.txtHandshake.DropDownStyle = ComboBoxStyle.DropDownList;

2.2、选择串口信息进行连接

/// <summary>
        /// 获取串口信息
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="fail"></param>
        /// <returns></returns>
        public static SerialPort GetSerialPort(SerialPortSet setting, out string fail)
        {
            fail = string.Empty;
            try
            {
                _SerialPort = new SerialPort();
                _SerialPort.PortName = setting.PortName;
                _SerialPort.BaudRate = setting.BaudRate.ToInt32();
                _SerialPort.Parity = (Parity)Enum.Parse(typeof(Parity), setting.Parity, true);
                _SerialPort.DataBits = setting.DataBits.ToInt32();
                _SerialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), setting.StopBits, true);
                _SerialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), setting.Handshake, true);

                return _SerialPort;
            }
            catch (Exception ex)
            {
                fail = "打开串口 异常:" + ex.Message;
                return null;
            }
        }

2.3、选择相关发送接收配置

支持UTF-8、ASCII、GB2312、16进制内容,收、发选择;支持间隔发送,循环发送,批处理发送,输入数据可以从外部文件导入。

2.4、发送命令或消息

/// <summary>
        /// 发送命令或消息
        /// </summary>
        /// <param name="content"></param>
        private void SendByte(string content)
        {
            try
            {
                if (this.ckbShowSend.Checked)
                    this.AppendText(content);

                byte[] buffer;
                if (this.txtSendEncoding.Text.Length <= 0)
                    buffer = Encoding.Default.GetBytes(this.txtContent.Text);
                else if (this.txtSendEncoding.Text == "16进制")
                    buffer = this.HexToByte(this.txtContent.Text);
                else
                    buffer = Encoding.GetEncoding(this.txtSendEncoding.Text).GetBytes(this.txtContent.Text);
                //向串口发送数据
                this._SerialPort.Write(buffer, 0, buffer.Length);
            }
            catch (Exception ex)
            {
                WinMessageBox.Warning("发送失败:" + ex.Message);
            }
        }

2.5、接收读取返回结果

/// <summary>
        /// 接收读取返回结果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] buffer = new byte[this._SerialPort.ReadBufferSize];
            int count = this._SerialPort.Read(buffer, 0, buffer.Length);
            //string str = Encoding.Default.GetString(readBuffer).TrimEnd('\0');
            if (this.txtEncoding.Text.Length <= 0)
                this.AppendText(System.Text.Encoding.Default.GetString(buffer,0, count));
            else if (this.txtEncoding.Text == "16进制")
                this.AppendText(this.ByteToHex(buffer,0,count));
            else
                this.AppendText(System.Text.Encoding.GetEncoding(this.txtEncoding.Text).GetString(buffer,0,count));
        }

3、结语

  至此介绍完毕,本项目开源,源码地址:https://gitee.com/ShiQuan25/SerialHelper 

  安装包下载地址:https://gitee.com/ShiQuan25/SerialHelper/attach_files/1048876/download/ShiQuan.SerialHelper.zip

  不当之处,欢迎指正!