赞
踩
最近的上位机开发工作中开始频繁涉及到网口、串口的通讯,网上找了各种资料和帖子都没怎么找到好用的开源代码或者工具。目前找到几个好一点的方式来实现的网口和串口通讯工具包,先写个好用的TCP的negut包记录下来,将使用的步骤写下来做个记录。
本博客主要用来记录自己学到的东西,用于以后回来查看和使用。也会标注来源,各位若是对某项内容感兴趣,可去来源处更加细致的学习
实现效果如下,右侧为制作的测试程序:能够收发数据,检测连接状态。并且收发5000多行数据量的内容都不会出现数据错误的现象,速度也很快,能够满足个人工作需求。重点是如何使用”“STTech.ByteslO.Tcp”这个nuget包。
开发工具:Visual Studio 2022
用户界面框架:winform
框架版本:.NET Framework 4.8
选择 “Windows窗体应用(NET Framework)” 项目
输入项目名称:TCP_Client,使用框架为.NET Framework 4.8
右键项目,准备添加TCP的nuget包
使用的nuget包为:STTech.ByteslO.Tcp,版本:2.14.6-alpha0225(也可选择最新版本下载,不必强求版本一致),在nuget管理界面的浏览页面下搜索bytesio,找到nuget包。点击安装并确定
放入容器控件groupbox、工具条控件ToolStrip和显示属性的PropertyGrid控件
groupbox的text改为:连接信息
ToolStrip增加两个text类型的文本按钮:连接、断开
PropertyGrid的dock设为:Fill,并将控件置于顶层
再加两个groupbox容器,放置右侧,内部各塞一个 RichTextBox
最终界面如下
能够实现参数的设定和简单的连接,效果如下图一
图一:左侧网口调试工具(模拟服务端) ,右侧测试程序(模拟客户端)
代码如下:
- 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();
- }
- }
- }
能够做到发送数据、接收数据和检查连接状态,效果如下图
图二:左侧网模拟服务端收发数据 ,右侧测试程序收发数据 (模拟客户端)
新增代码如下:
其中跨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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。