文章目录
源码地址:C# 串口通信测试软件
框架准备
出于简单考虑,首先创建一个
Winform
项目,本文项目名称为
portTest
。
串口通信,至少有两个串口才能通信,所以拖动两个
GroupBox
,一左一右,里面分别放置一个
Combobox
、一个按钮,以及两个
TextBox
用于发送和接收内容,第二个
TextBox
要点击右上角的三角选择
多行
。
布局结果为
其中,串口A和串口B中各控件的名称为
串口A串口B
combobox
cbA
cbB
按钮
btnA
BtnB
发送文本框
tbSendA
tbSendB
接收文本框
tbRecvA
tbRecvB
串口准备
由于.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
即可。
privatevoidbtnA_Click(object sender,EventArgs e){if(btnA.Text=="连接"){
pA =newSerialPort(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
会自动创建,其内容为
privatevoidPA_DataReceived(object sender,SerialDataReceivedEventArgs e){byte[] data =newbyte[pA.BytesToRead];
pA.Read(data,0, data.Length);//从串口读取数据string info = Encoding.UTF8.GetString(data);
tbRecvA.BeginInvoke(newAction(()=>{ tbRecvA.Text +=$"接收:{info}";}));}
由于串口的接收函数是异步执行的,并不属于窗口主线程,所以当串口接收到数据后,如果想在窗口中显示,就必须用
BeginInvoke
来另开一个线程。
最后,编写串口的发送程序,当
tbSend
检测到回车键时,则发送文本框中的内容。
代码为
privatevoidtbSendA_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
组串口用相同的方法实现后,就可以进行测试了,效果如下
版权归原作者 微小冷 所有, 如有侵权,请联系我们删除。