0


C#接化发:串口通信

文章目录

源码地址: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

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

在这里插入图片描述

标签: c# 串口通信 Ports

本文转载自: https://blog.csdn.net/m0_37816922/article/details/129637911
版权归原作者 微小冷 所有, 如有侵权,请联系我们删除。

“C#接化发:串口通信”的评论:

还没有评论