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();
// 设置控件属性、位置和事件
// 这里需要详细设置每个控件的位置、大小、文本等属性
// 以及添加事件处理器
}
}
说明
-
串口配置:
- 选择可用的COM端口
- 设置波特率(常用9600, 115200等)
- 设置数据位(通常为8)
- 设置停止位(通常为1)
- 设置校验位(通常为None)
-
数据接收:
- 接收的数据会显示在接收文本框中
- 可以选择以十六进制格式显示数据
-
数据发送:
- 在发送文本框中输入要发送的数据
- 可以选择以十六进制格式发送数据
- 可以选择发送时自动附加换行符
-
其他功能:
- 可以清空接收或发送文本框
- 可以刷新可用的COM端口列表
参考代码 C# 串口调试助手源码(COM口) www.3dddown.com/cna/54343.html
事项
- 确保已安装相应的串口驱动程序
- 确保串口没有被其他程序占用
- 发送和接收的十六进制数据应以空格分隔(例如:
48 65 6C 6C 6F)

浙公网安备 33010602011771号