C# 串口调试助手

C#串口调试助手实现,使用Windows Forms和.NET的SerialPort类。这个应用程序允许用户配置串口参数、发送和接收数据,并支持十六进制显示。

using System;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace SerialPortDebugger
{
    public partial class MainForm : Form
    {
        private SerialPort serialPort;
        private bool isHexDisplay = false;
        private bool isHexSend = false;
        private bool isConnected = false;

        public MainForm()
        {
            InitializeComponent();
            InitializeSerialPort();
            RefreshPortList();
        }

        private void InitializeSerialPort()
        {
            serialPort = new SerialPort();
            serialPort.DataReceived += SerialPort_DataReceived;
        }

        private void RefreshPortList()
        {
            string[] ports = SerialPort.GetPortNames();
            cmbPortName.Items.Clear();
            cmbPortName.Items.AddRange(ports);
            if (ports.Length > 0)
                cmbPortName.SelectedIndex = 0;
        }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int bytesToRead = serialPort.BytesToRead;
            byte[] buffer = new byte[bytesToRead];
            serialPort.Read(buffer, 0, bytesToRead);

            // 跨线程更新UI
            this.Invoke(new Action(() =>
            {
                if (isHexDisplay)
                {
                    string hexString = BitConverter.ToString(buffer).Replace("-", " ");
                    txtReceivedData.AppendText(hexString + " ");
                }
                else
                {
                    string text = Encoding.UTF8.GetString(buffer);
                    txtReceivedData.AppendText(text);
                }
            }));
        }

        private void btnRefreshPorts_Click(object sender, EventArgs e)
        {
            RefreshPortList();
        }

        private void btnOpenClose_Click(object sender, EventArgs e)
        {
            if (isConnected)
            {
                ClosePort();
            }
            else
            {
                OpenPort();
            }
        }

        private void OpenPort()
        {
            try
            {
                serialPort.PortName = cmbPortName.Text;
                serialPort.BaudRate = int.Parse(cmbBaudRate.Text);
                serialPort.DataBits = int.Parse(cmbDataBits.Text);
                serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
                serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);

                serialPort.Open();
                isConnected = true;
                UpdateConnectionStatus();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"打开串口失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void ClosePort()
        {
            try
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                }
                isConnected = false;
                UpdateConnectionStatus();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"关闭串口失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void UpdateConnectionStatus()
        {
            btnOpenClose.Text = isConnected ? "关闭串口" : "打开串口";
            gbSerialConfig.Enabled = !isConnected;
            lblStatus.Text = isConnected ? $"已连接到 {serialPort.PortName}" : "未连接";
            lblStatus.ForeColor = isConnected ? System.Drawing.Color.Green : System.Drawing.Color.Red;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (!isConnected)
            {
                MessageBox.Show("请先打开串口", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                string data = txtSendData.Text;
                if (isHexSend)
                {
                    // 处理十六进制发送
                    data = data.Replace(" ", "");
                    byte[] hexBytes = new byte[data.Length / 2];
                    for (int i = 0; i < hexBytes.Length; i++)
                    {
                        hexBytes[i] = Convert.ToByte(data.Substring(i * 2, 2), 16);
                    }
                    serialPort.Write(hexBytes, 0, hexBytes.Length);
                }
                else
                {
                    // 文本发送
                    if (chkAppendNewLine.Checked)
                    {
                        data += Environment.NewLine;
                    }
                    serialPort.Write(data);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"发送数据失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void chkHexDisplay_CheckedChanged(object sender, EventArgs e)
        {
            isHexDisplay = chkHexDisplay.Checked;
        }

        private void chkHexSend_CheckedChanged(object sender, EventArgs e)
        {
            isHexSend = chkHexSend.Checked;
        }

        private void btnClearReceived_Click(object sender, EventArgs e)
        {
            txtReceivedData.Clear();
        }

        private void btnClearSend_Click(object sender, EventArgs e)
        {
            txtSendData.Clear();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort.IsOpen)
            {
                serialPort.Close();
            }
        }
    }
}

界面设计代码

还需要创建一个对应的窗体设计器代码(MainForm.Designer.cs),或者使用Visual Studio的设计器创建界面。

partial class MainForm
{
    private System.ComponentModel.IContainer components = null;
    
    private GroupBox gbSerialConfig;
    private ComboBox cmbPortName;
    private ComboBox cmbBaudRate;
    private ComboBox cmbDataBits;
    private ComboBox cmbStopBits;
    private ComboBox cmbParity;
    private Button btnRefreshPorts;
    private Button btnOpenClose;
    private Label lblStatus;
    
    private GroupBox gbReceivedData;
    private TextBox txtReceivedData;
    private CheckBox chkHexDisplay;
    private Button btnClearReceived;
    
    private GroupBox gbSendData;
    private TextBox txtSendData;
    private CheckBox chkHexSend;
    private CheckBox chkAppendNewLine;
    private Button btnSend;
    private Button btnClearSend;
    
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
    
    private void InitializeComponent()
    {
        // 这里应该由Visual Studio设计器自动生成代码
        // 以下是控件的基本初始化建议
        this.gbSerialConfig = new GroupBox();
        this.cmbPortName = new ComboBox();
        this.cmbBaudRate = new ComboBox();
        this.cmbDataBits = new ComboBox();
        this.cmbStopBits = new ComboBox();
        this.cmbParity = new ComboBox();
        this.btnRefreshPorts = new Button();
        this.btnOpenClose = new Button();
        this.lblStatus = new Label();
        
        this.gbReceivedData = new GroupBox();
        this.txtReceivedData = new TextBox();
        this.chkHexDisplay = new CheckBox();
        this.btnClearReceived = new Button();
        
        this.gbSendData = new GroupBox();
        this.txtSendData = new TextBox();
        this.chkHexSend = new CheckBox();
        this.chkAppendNewLine = new CheckBox();
        this.btnSend = new Button();
        this.btnClearSend = new Button();
        
        // 设置控件属性、位置和事件
        // 这里需要详细设置每个控件的位置、大小、文本等属性
        // 以及添加事件处理器
    }
}

说明

  1. 串口配置

    • 选择可用的COM端口
    • 设置波特率(常用9600, 115200等)
    • 设置数据位(通常为8)
    • 设置停止位(通常为1)
    • 设置校验位(通常为None)
  2. 数据接收

    • 接收的数据会显示在接收文本框中
    • 可以选择以十六进制格式显示数据
  3. 数据发送

    • 在发送文本框中输入要发送的数据
    • 可以选择以十六进制格式发送数据
    • 可以选择发送时自动附加换行符
  4. 其他功能

    • 可以清空接收或发送文本框
    • 可以刷新可用的COM端口列表

参考代码 C# 串口调试助手源码(COM口) www.3dddown.com/cna/54343.html

事项

  1. 确保已安装相应的串口驱动程序
  2. 确保串口没有被其他程序占用
  3. 发送和接收的十六进制数据应以空格分隔(例如:48 65 6C 6C 6F
posted @ 2025-12-15 15:50  yes_go  阅读(2)  评论(0)    收藏  举报