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#接化发:串口通信”的评论:

还没有评论