最近的上位机开发工作中开始频繁涉及到网口、串口的通讯,网上找了各种资料和帖子都没怎么找到好用的开源代码或者工具。目前找到几个好一点的方式来实现的网口和串口通讯工具包,先写个好用的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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐