C#接化发:串口通信

该文介绍了如何使用C#进行串口通信的开发,包括创建Winform项目,添加控件,利用System.IO.Ports库,设置串口参数,处理DataReceived事件进行数据接收,以及使用虚拟串口工具com0com进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码地址:C# 串口通信测试软件

框架准备

出于简单考虑,首先创建一个Winform项目,本文项目名称为portTest

串口通信,至少有两个串口才能通信,所以拖动两个GroupBox,一左一右,里面分别放置一个Combobox、一个按钮,以及两个TextBox用于发送和接收内容,第二个TextBox要点击右上角的三角选择多行

布局结果为

在这里插入图片描述

其中,串口A和串口B中各控件的名称为

串口A串口B
comboboxcbAcbB
按钮btnABtnB
发送文本框tbSendAtbSendB
接收文本框tbRecvAtbRecvB

串口准备

由于.Net6.0并不内置串口通信模块,所以需要额外下载,点击菜单栏工具->NuGet包管理器->管理解决方案的NuGet包,点击浏览选项卡,搜索Ports,选择System.IO.Ports,在右侧出现的详细信息中,选中portTest项目,点击安装按钮。

在这里插入图片描述

此外,如果没有合适的用于串口测试的硬件设备,可以下载一个虚拟串口,这里推荐开源的com0com,下载之后根据自己电脑位数选择一个进行安装,记住安装路径,安装结束后,打开相应路径中的setupg.exe,如下图所示,通过Add Pair可以添加串口对

在这里插入图片描述

在添加串口对之后,在右侧最上方可以更改串口名字,例如改为COM4和COM5,然后点击apply,串口名字就会在左侧发生更改。根据右侧线路图可知,发给COM4的信息,会被转发给COM5;发给COM5的信息则会转发给COM4。

接、化、发

点击F7进入代码页面,开始串口开发,主要分为一下流程。

本文基于.Net6.0在顶级语句中开发,所以不需要额外using;否则的话需要添加using System.IO.Ports;,以确保串口可以调用。并声明两个全局变量,用于后续的串口通信。

  SerialPort pA;
  SerialPort pB;

然后,确保combobox可以正确识别串口名称,故而在 InitializeComponent();下方,添加如下循环

foreach (var item in SerialPort.GetPortNames())
{
    cbA.Items.Add(item);
    cbB.Items.Add(item);
}

其中,GetPortNames函数可以获取所有可用的串口名称。

接下来,双击连接按钮,创建点击命令,下面以按钮A进行示例,对按钮B只需将所有的A换成B即可。

private void btnA_Click(object sender, EventArgs e)
{
    if (btnA.Text=="连接"){
        pA = new SerialPort(cbA.SelectedItem.ToString(), 
            115200, Parity.Odd, 7, StopBits.One);
        pA.Open();
        pA.DataReceived += PA_DataReceived;
        btnA.Text = "断开";
    }
    else{
        pA.Close();
        btnA.Text = "连接";
    }
}

SerialPort的构造函数中,输入参数分别是串口名称、波特率、校验位、长度、截止位。

PA_DataReceived是一个委托,为串口接收到数据时执行的操作,一般写完+=之后,点击回车VS会自动创建,其内容为

private void PA_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] data = new byte[pA.BytesToRead];
    pA.Read(data, 0, data.Length);//从串口读取数据
    string info = Encoding.UTF8.GetString(data);
    tbRecvA.BeginInvoke(new Action(() => { tbRecvA.Text += $"接收:{info}"; }));
}

由于串口的接收函数是异步执行的,并不属于窗口主线程,所以当串口接收到数据后,如果想在窗口中显示,就必须用BeginInvoke来另开一个线程。

最后,编写串口的发送程序,当tbSend检测到回车键时,则发送文本框中的内容。

代码为

private void tbSendA_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode != Keys.Enter)
        return;
    var data = Encoding.UTF8.GetBytes(tbSendA.Text);
    tbRecvA.Text += $"发送:{tbSendA.Text}\n";
    pA.Write(data, 0, data.Length);
}

测试

上面只实现了A组串口,将B组串口用相同的方法实现后,就可以进行测试了,效果如下

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值