物联网关键技术—制作一个串口助手


前言

要制作一个C#串口助手,你需要使用System.IO.Ports命名空间中的SerialPort类。以下是一个简单的示例:

首先,创建一个新的C# Windows Forms应用程序项目。

在窗体上添加以下控件:

  1. 两个Button控件(分别命名为btnOpen和btnClose)
  2. 一个ComboBox控件(命名为cmbPortName)
  3. 一个TextBox控件(命名为txtSendData)
  4. 一个Button控件(命名为btnSend)
  5. 一个TextBox控件(命名为txtReceiveData)

一、串口助手是什么?

串口助手是一种用于调试串口通信的工具软件

在现代计算机技术中,串口助手扮演着重要的角色,它不仅帮助开发者和技术人员进行有效的串行通信调试,还支持数据的收发与显示,极大地简化了硬件与软件间的连接和数据传输过程。以下是串口助手的多个关键方面:

(一)基本功能

  1. 串行数据收发:串口助手能够通过电脑的串口(包括通过USB转换的串口)发送和接收数据。这对于调试嵌入式系统或与微控制器等硬件设备通信至关重要。
  2. 参数配置:用户可以根据需求设置波特率、校验位、数据位和停止位等串口通信参数。这些参数的灵活配置确保了与各种设备的通信兼容性。
  3. 实时数据显示:接收到的数据可以实时显示在用户界面上,支持以ASCII码或十六进制格式展示,便于用户直观理解通信内容。

(二)高级功能

  1. 自动发送周期设定:部分串口助手支持设定自动发送周期,用户可以定时发送特定数据,适用于需要周期性传输数据的场景。
  2. 文本文件发送:可以发送任意大小的文本文件,这在进行大量数据传送或日志记录时非常有用。
  3. 脚本运行与编码转换:某些高级串口助手支持脚本运行和编码转换,这使得自动化测试和处理特殊编码数据成为可能。

(三)应用案例

  1. Modbus RTU通信:串口助手常用于模拟Modbus RTU通信中的主站,设置通信参数并发送报文,检验从站是否能正确接收和响应。
  2. 硬件开发与调试:在硬件开发阶段,串口助手用于检查硬件设备(如PLC或温控仪表)的串行通信是否正常,确保设备按预期工作。

(四)技术细节

  1. UART通信协议支持:串口助手通常基于UART协议实现,这是一种广泛使用的异步串行通信协议,支持全双工数据传输。
  2. 多平台兼容性:大多数串口助手支持Windows平台,也有部分支持Linux或其他操作系统,提供跨平台的解决方案。

(五)选择建议

  1. 根据需求选择工具:选择串口助手时,应考虑其支持的功能是否符合项目需求,例如是否需要脚本支持或特定的数据处理功能。
  2. 用户友好性:界面直观、操作简单的工具可以提高开发效率,一些工具支持全键盘操作,适合喜欢快捷键操作的用户。

二、使用步骤

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)
        {

        }
    }
}

四、传输过程

五、项目总结

        总的来说,串口助手是开发和调试中不可或缺的工具,它通过提供强大的串行通信功能,帮助用户高效地完成硬件与软件间的接口测试和数据交换。在选择和使用串口助手时,了解其核心功能和高级特性,以及如何根据具体需求选择合适的工具,对于确保通信的准确性和提高开发效率都具有重要意义。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值