前言
要制作一个C#串口助手,你需要使用System.IO.Ports命名空间中的SerialPort类。以下是一个简单的示例:
首先,创建一个新的C# Windows Forms应用程序项目。
在窗体上添加以下控件:
- 两个Button控件(分别命名为btnOpen和btnClose)
- 一个ComboBox控件(命名为cmbPortName)
- 一个TextBox控件(命名为txtSendData)
- 一个Button控件(命名为btnSend)
- 一个TextBox控件(命名为txtReceiveData)
一、串口助手是什么?
串口助手是一种用于调试串口通信的工具软件。
在现代计算机技术中,串口助手扮演着重要的角色,它不仅帮助开发者和技术人员进行有效的串行通信调试,还支持数据的收发与显示,极大地简化了硬件与软件间的连接和数据传输过程。以下是串口助手的多个关键方面:
(一)基本功能
- 串行数据收发:串口助手能够通过电脑的串口(包括通过USB转换的串口)发送和接收数据。这对于调试嵌入式系统或与微控制器等硬件设备通信至关重要。
- 参数配置:用户可以根据需求设置波特率、校验位、数据位和停止位等串口通信参数。这些参数的灵活配置确保了与各种设备的通信兼容性。
- 实时数据显示:接收到的数据可以实时显示在用户界面上,支持以ASCII码或十六进制格式展示,便于用户直观理解通信内容。
(二)高级功能
- 自动发送周期设定:部分串口助手支持设定自动发送周期,用户可以定时发送特定数据,适用于需要周期性传输数据的场景。
- 文本文件发送:可以发送任意大小的文本文件,这在进行大量数据传送或日志记录时非常有用。
- 脚本运行与编码转换:某些高级串口助手支持脚本运行和编码转换,这使得自动化测试和处理特殊编码数据成为可能。
(三)应用案例
- Modbus RTU通信:串口助手常用于模拟Modbus RTU通信中的主站,设置通信参数并发送报文,检验从站是否能正确接收和响应。
- 硬件开发与调试:在硬件开发阶段,串口助手用于检查硬件设备(如PLC或温控仪表)的串行通信是否正常,确保设备按预期工作。
(四)技术细节
- UART通信协议支持:串口助手通常基于UART协议实现,这是一种广泛使用的异步串行通信协议,支持全双工数据传输。
- 多平台兼容性:大多数串口助手支持Windows平台,也有部分支持Linux或其他操作系统,提供跨平台的解决方案。
(五)选择建议
- 根据需求选择工具:选择串口助手时,应考虑其支持的功能是否符合项目需求,例如是否需要脚本支持或特定的数据处理功能。
- 用户友好性:界面直观、操作简单的工具可以提高开发效率,一些工具支持全键盘操作,适合喜欢快捷键操作的用户。
二、使用步骤
1.双击btnOpen按钮,为其添加Click事件处理程序,并添加以下代码
private void btnOpen_Click(object sender, EventArgs e) { if (!serialPort1.IsOpen) { try { serialPort1.PortName = cmbPortName.Text; serialPort1.BaudRate = 9600; serialPort1.DataBits = 8; serialPort1.Parity = Parity.None; serialPort1.StopBits = StopBits.One; serialPort1.Open(); btnOpen.Enabled = false; btnClose.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
2.双击btnClose按钮,为其添加Click事件处理程序,并添加以下代码
private void btnClose_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
btnOpen.Enabled = true;
btnClose.Enabled = false;
}
}
3.双击btnSend按钮,为其添加Click事件处理程序,并添加以下代码
private void btnSend_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write(txtSendData.Text);
}
}
4.在Form1的构造函数中,添加以下代码以获取可用的串口列表
public Form1()
{
InitializeComponent();
foreach (string portName in System.IO.Ports.SerialPort.GetPortNames())
{
cmbPortName.Items.Add(portName);
}
}
5.为SerialPort对象添加DataReceived事件处理程序,以便在接收到数据时更新txtReceiveData文本框
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
txtReceiveData.Invoke(new Action(() => txtReceiveData.AppendText(serialPort1.ReadExisting())));
}
6.成果展示
运行成功
三、源代码
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;
using System.IO.Ports;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace 串口
{
public partial class Form1 : Form
{
SerialPort com1 = new SerialPort("COM4");
public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
comboBox2.SelectedIndex = 2;
comboBox3.SelectedIndex = 0;
comboBox4.SelectedIndex = 1;
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "打开串口")
{
if (!com1.IsOpen)
{
com1.Close();
com1.PortName = comboBox1.Text;
com1.BaudRate = int.Parse(comboBox4.Text);
com1.DataBits = int.Parse(comboBox4.Text);
switch (comboBox4.SelectedIndex)
{
case 0:
com1.Parity = Parity.None; break;
case 1:
com1.Parity = Parity.Even; break;
case 2:
com1.Parity = Parity.Odd; break;
}
button1.Text = "关闭串口";
com1.Open();
}
else
{
label4.Text = "串口已打开";
}
}
else
{
button1.Text = "打开串口";
}
}
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void label6_Click(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
byte[] ss = { 0xff, 0x55, 0x00, 0x01, 0x00, 0x50, 0x74 };
com1.Write(ss, 0, ss.Length);
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void button4_Click(object sender, EventArgs e)
{
int len = com1.BytesToRead;
byte[] rr = new byte[len];
com1.Read(rr, 0, rr.Length);
for (int i = 0; i < len; i++)
{
textBox2.Text += rr[i].ToString("X").PadLeft(2, '0') + " ";
}
}
private void 串口设置_Enter(object sender, EventArgs e)
{
}
}
}
四、传输过程
五、项目总结
总的来说,串口助手是开发和调试中不可或缺的工具,它通过提供强大的串行通信功能,帮助用户高效地完成硬件与软件间的接口测试和数据交换。在选择和使用串口助手时,了解其核心功能和高级特性,以及如何根据具体需求选择合适的工具,对于确保通信的准确性和提高开发效率都具有重要意义。