最近的上位机开发工作中开始频繁涉及到网口、串口的通讯,网上找了各种资料和帖子都没怎么找到好用的开源代码或者工具。目前找到几个好一点的方式来实现的网口和串口通讯工具包,先写个好用的TCP的negut包记录下来,将使用的步骤写下来做个记录。
本博客主要用来记录自己学到的东西,用于以后回来查看和使用。也会标注来源,各位若是对某项内容感兴趣,可去来源处更加细致的学习
实现效果如下,右侧为制作的测试程序:能够收发数据,检测连接状态。并且收发5000多行数据量的内容都不会出现数据错误的现象,速度也很快,能够满足个人工作需求。重点是如何使用”“STTech.ByteslO.Tcp”这个nuget包。
一、使用的环境
开发工具:Visual Studio 2022
用户界面框架:winform
框架版本:.NET Framework 4.8
二、项目搭建
1、新建winform项目
选择 “Windows窗体应用(NET Framework)” 项目
输入项目名称:TCP_Client,使用框架为.NET Framework 4.8
2、添加nuget包
右键项目,准备添加TCP的nuget包
使用的nuget包为:STTech.ByteslO.Tcp,版本:2.14.6-alpha0225(也可选择最新版本下载,不必强求版本一致),在nuget管理界面的浏览页面下搜索bytesio,找到nuget包。点击安装并确定
3、创建界面
放入容器控件groupbox、工具条控件ToolStrip和显示属性的PropertyGrid控件
groupbox的text改为:连接信息
ToolStrip增加两个text类型的文本按钮:连接、断开
PropertyGrid的dock设为:Fill,并将控件置于顶层
再加两个groupbox容器,放置右侧,内部各塞一个 RichTextBox
最终界面如下
四、主要代码编写
1、TcpClient的创建和“连接”、“断开”按钮的简单代码实现
能够实现参数的设定和简单的连接,效果如下图一
图一:左侧网口调试工具(模拟服务端) ,右侧测试程序(模拟客户端)
代码如下:
using STTech.BytesIO.Tcp;
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;
namespace TCP_Client
{
public partial class Form1 : Form
{
//创建TCP客户端对象,STTech.BytesIO.Tcp.TcpClient
private TcpClient tcpClient;
public Form1()
{
InitializeComponent();
//tcpClient new一个实体对象
tcpClient = new TcpClient();
//将TcpClient类的属性置入propertyGrid1控件
propertyGrid1.SelectedObject = tcpClient;
}
private void toolStrip_btn_connect_Click(object sender, EventArgs e)
{//tcp连接
tcpClient.Connect();
}
private void toolStrip_btn_diconnect_Click(object sender, EventArgs e)
{//tcp断开连接
tcpClient.Disconnect();
}
}
}
2、 TcpClient的“数据接收”、”连接状态“的事件函数处理 和 “发送”按钮的简单代码实现
能够做到发送数据、接收数据和检查连接状态,效果如下图
图二:左侧网模拟服务端收发数据 ,右侧测试程序收发数据 (模拟客户端)
新增代码如下:
其中跨UI线程的解决方式和原出处不同,原出处是通过关闭跨UI线程报错来解决问题,这里是调用Form的Invoke方法跨线程访问控件
public Form1()
{
InitializeComponent();
//tcpClient new一个实体对象
tcpClient = new TcpClient();
//将TcpClient类的属性置入propertyGrid1控件
propertyGrid1.SelectedObject = tcpClient;
//tcp接收数据时触发的事件
tcpClient.OnDataReceived += TcpClient_OnDataReceived;
//tcp连接成功时触发的事件
tcpClient.OnConnectedSuccessfully += TcpClient_OnConnectedSuccessfully;
//tcp连接断开时触发的事件
tcpClient.OnDisconnected += TcpClient_OnDisconnected;
}
private void TcpClient_OnDisconnected(object sender, STTech.BytesIO.Core.DisconnectedEventArgs e)
{
Print($"已断开{e.ReasonCode}");
}
private void TcpClient_OnConnectedSuccessfully(object sender, STTech.BytesIO.Core.ConnectedSuccessfullyEventArgs e)
{
Print("连接成功");
}
private void TcpClient_OnDataReceived(object sender, STTech.BytesIO.Core.DataReceivedEventArgs e)
{
Print($"收到数据:{e.Data.EncodeToString("GBK")}");
}
private void btn_send_Click(object sender, EventArgs e)
{//发送数据给服务端,编码格式为"GBK":可发送中文;编码格式默认"UTF-8":发送中文会有问题
tcpClient.Send(richtbx_send.Text.GetBytes("GBK"));
}
private void Print(string msg)
{
//线程的修改直接更新到UI主线程是不被允许的,这里通过调用Form的Invoke方法跨线程访问控件
this.Invoke(new Action(() =>
{
richtbx_log.AppendText($"[{DateTime.Now}] {msg}\r\n");
}));
}
五、总结
1、STTech.ByteslO.Tcp这个nuget包目前使用确实很好,上手快、较大数据量收发无错误
2、winform跨UI线程调用界面控件可以使用Invoke来实现
this.Invoke(new Action(() =>
{
//调用控件做事
}));
原内容出处:https://www.bilibili.com/video/BV1jB4y1R7fx/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=320122341f21b9845ec2048525e53a70注:单身狗注意,原视频狗粮很多,学着学着忽然就被狗粮拍脸上了(T⌓T)
源代码(本文中自己试验写的程序):ShareSpace: 分享个人使用的试验和测试好的代码和工具 - Gitee.com