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


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

     

      1、概述

      

      串口调试助手,广泛应用于工控领域的数据监控、数据采集、数据分析等工作,可以帮助串口应用设计、开发、测试人员检查所开发的串口应用软硬件的数据收发状况,提高开发的速度,成为您的串口应用的开发助手。
    实全串口调试助手是绿色软件,只有一个执行文件,适用于各版本Windows操作系统,基于C# .Net 4.0 框架开发。可以在一台PC上同时启动多个串口调试助手(使用不同的COM口)。
      典型应用场合:通过串口调试助手与自行开发的串口程序或者串口设备进行通信联调。
      支持多串口,自动监测枚举本地可用串口;自由设置串口号、波特率、校验位、数据位和停止位等(支持自定义非标准波特率);
      支持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

      不当之处,欢迎指正!

     

  • 相关阅读:
    Thinkphp下载oss文件至本地压缩包
    【Linux】升级GCC(版本9.3),补充:binutils
    架构设计 - MySQL 插入数据性能优化策略
    Linux CentOS7 添加网卡
    修谱是一件好事:薪火相传,让老一辈庇护和提携后辈,造福乡里宗亲
    「出海」势头正盛,中国车企需要更好的“全球导航”
    ZYNQ:串口-CAN协议转换
    【elasticsearch实战】从零开始设计全站搜索引擎
    使用Docker+PHP搭建苹果Maccms的影视站详细教程
    2023年中国背光显示面板分类、市场规模及企业分析[图]
  • 原文地址:https://www.cnblogs.com/henxiao25/p/16219156.html