当前位置: 首页 > news >正文

Winform上位机TCP客户端/服务端、串口通信

Winform上位机TCP客户端/服务端、串口通信

背景

日常练习,着急换工作,心态都快乱了。

工具

串口调试助手

网络调试助手

代码

客户端

using Microsoft.VisualBasic.Logging;
using System.Net.Sockets;
using System.Text;namespace TcpClientDemo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpClient tcpClient = new TcpClient();/// <summary>/// 连接服务端/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void connect_Click(object sender, EventArgs e){if (!tcpClient.Connected){tcpClient.Connect(IP.Text, int.Parse(PORT.Text));//开启线程一直读取数据Task.Run(() =>{while (true){NetworkStream networkStream = tcpClient.GetStream();if (networkStream != null){byte[] datas = new byte[1024];networkStream.Read(datas, 0, datas.Length);this.BeginInvoke(new Action(() =>{log.Text = Encoding.UTF8.GetString(datas);}));}}});}}/// <summary>/// 发送数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void send_Click(object sender, EventArgs e){NetworkStream networkStream = tcpClient.GetStream();if (networkStream != null){byte[] datas = Encoding.UTF8.GetBytes(log.Text);networkStream.Write(datas, 0, datas.Length);}}private void Form1_Load(object sender, EventArgs e){IP.Text = "127.0.0.1";PORT.Text = "8899";}}
}

服务端

using Microsoft.VisualBasic.Logging;
using System.Net;
using System.Net.Sockets;
using System.Text;namespace TcpSeverDemo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//监听类TcpListener listener = null;//客户端TcpClient handler = null;NetworkStream stream = null;bool isrun = false;/// <summary>/// 打开/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void openServer_Click(object sender, EventArgs e){if (IP.Text.Trim().Length < 9 && Port.Text.Trim().Length == 0){MessageBox.Show("IP和端口无效");return;}listener = new TcpListener(IPAddress.Parse(IP.Text), int.Parse(Port.Text));listener.Start();isrun = true;}private void send_Click(object sender, EventArgs e){if (stream != null){byte[] buffer = Encoding.UTF8.GetBytes(log.Text);//load已经连接,可以直接发送stream.Write(buffer, 0, buffer.Length);}}private void Form1_Load(object sender, EventArgs e){IP.Text = "127.0.0.1";Port.Text = "9800";try{Task.Run(() =>{while (true){if (isrun && listener != null){//用来接收handler = listener.AcceptTcpClient();//创建网络流 已经连接stream = handler.GetStream();byte[] buffer = new byte[1024];if (stream != null){stream.Read(buffer, 0, buffer.Length);this.BeginInvoke(new Action(() =>{log.Text = Encoding.UTF8.GetString(buffer);}));}}Thread.Sleep(50);}});}catch (Exception){}}/// <summary>/// 关闭/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_FormClosing(object sender, FormClosingEventArgs e){isrun = false;if (listener != null){listener.Stop();}}}
}

串口

using Microsoft.VisualBasic.Logging;
using System.Data;
using System.IO.Ports;
using System.Text;namespace PortDemo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}SerialPort serialPort = new SerialPort();private void open_Click(object sender, EventArgs e){try{if (!serialPort.IsOpen){serialPort.Open();serialPort.DataReceived += SerialPort_DataReceived;}}catch (Exception ex){log.Text = ex.Message;}}private void read_Click(object sender, EventArgs e){}private void write_Click(object sender, EventArgs e){serialPort.Write(log.Text);}private void Form1_Load(object sender, EventArgs e){//导入一些基础参数List<string> ports = SerialPort.GetPortNames().ToList();foreach (var item in ports){port.Items.Add(item);}List<int> baus = new List<int> { 9600, 115200 };foreach (var item in baus){bau.Items.Add(item);}List<int> databits = new List<int> { 6, 7, 8 };foreach (var item in databits){databit.Items.Add(item);}List<string> cks = new List<string> { "None" };foreach (var item in cks){check.Items.Add(item);}List<string> stops = new List<string> { "One" };foreach (var item in stops){stop.Items.Add(item);}try{serialPort.PortName = port.Text;serialPort.BaudRate = int.Parse(bau.Text);serialPort.Parity = Parity.None;serialPort.DataBits = int.Parse(databit.Text);serialPort.StopBits = StopBits.One;}catch (Exception ex){log.Text = ex.Message;}}private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){byte[] bytes = new byte[1024];try{serialPort.Read(bytes, 0, bytes.Length);string data = Encoding.UTF8.GetString(bytes);this.Invoke(() =>{log.Text = data;});}catch (Exception ex){log.Text = ex.Message;}}}
}

Socket通信

using System;
using System.Net;
using System.Net.Sockets;class Program
{static void Main(){Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);listener.Bind(new IPEndPoint(IPAddress.Any, 13000));listener.Listen(10);while (true){Console.WriteLine("Waiting for a connection...");Socket handler = listener.Accept();Console.WriteLine("Connected!");// 处理连接HandleClient(handler);}}private static void HandleClient(Socket client){NetworkStream stream = new NetworkStream(client);byte[] data = new byte[256];while (true){int bytes = stream.Read(data, 0, data.Length);if (bytes == 0)break;string text = Encoding.ASCII.GetString(data, 0, bytes);Console.WriteLine("Received: {0}", text);}client.Close();}
}

最简单的调用,之后会补充实际细节。这种基本不需要自己手动造轮子,除非重新开发,基本都是封装好的,会调用就可以,需要自己写的时候网上找找一堆。

相关文章:

Winform上位机TCP客户端/服务端、串口通信

Winform上位机TCP客户端/服务端、串口通信 背景 日常练习&#xff0c;着急换工作&#xff0c;心态都快乱了。 工具 串口调试助手 网络调试助手 代码 客户端 using Microsoft.VisualBasic.Logging; using System.Net.Sockets; using System.Text;namespace TcpClientDem…...

Linux基础复习(二)

前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root&#xff0c;则最后一个字符为# 否则&#xff0c;最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…...

nginx漏洞修复 ngx_http_mp4_module漏洞(CVE-2022-41742)【低可信】 nginx版本升级

风险描述&#xff1a; Nginx 是一款轻量级的Web服务器、反向代理服务器。 Nginx 的受影响版本中的ngx _http_mp4_module模块存在内存越界写入漏洞&#xff0c;当在配置中使用 mp4 directive时&#xff0c;攻击者可利用此漏洞使用使用ngx_http_mp4_module模块处理特制的音频或视…...

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

Java算法之递归算法-如何计算阶乘的值

上一篇学了递归之后&#xff0c;练习一下递归算法。 题目&#xff1a;使用递归算法计算阶乘的值&#xff0c;也就是5&#xff01;5*4*3*2*1&#xff0c;直接使用循环是非常简单的&#xff0c;这边练习一下递归算法。 先写一下两个条件 基线条件&#xff1a;等于1的时候返回1…...

python爬虫入门小案例

python爬虫 以下内容仅供学习交流,请勿用作其他用途,若涉及隐私和版权问题,请及时联系我删除 闲来无事,学了学爬虫小知识,适合入门,文笔拙劣,还望见谅 爬虫是什么: 爬取网页上的文字,图片,视频,音频 自动化操作浏览器,比如填写表单,打卡,提高工作效率爬虫的注意事项: 爬虫…...

【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程

昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分&#xff1a; 1&#xff09;计算类&#xff1a;矩阵计算单元&#xff08;两个矩阵扔进去相乘&#xff09;、向量计算单元、标量计算单元 2&#xff09;控…...

系统架构设计师教程 第4章 信息安全技术基础知识-4.5 密钥管理技术4.6 访问控制及数字签名技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.5 密钥管理技术&4.6 访问控制及数字签名技术 4.5 密钥管理技术4.5.1 对称密钥的分配与管理4.5.1.1 密钥的使用控制4.5.1.1.1 密钥标签4.5.1.1.2 控制矢量4.5.1.2 密钥的分配4.5.1.2.1物理方式14.5.1.2.2 物理方式24.5.1…...

C语言日常练习Day13

目录 一、设半径r1.5&#xff0c;圆柱高h3&#xff0c;求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积 二、编写程序&#xff0c;用getchar函数读入两个字符给c1,c2&#xff0c;然后分别用putchar函数和printf函数输出这两个字符 三、输入4个整数&#xff0c;要求按由小…...

map、foreach、filter这些方法你还不知道什么时候该用哪个吗?那就看过来

forEach&#xff1a;‌主要用于遍历数组并对每个元素执行某种操作&#xff0c;‌通常用于改变当前数组里的值。‌它不会返回新数组&#xff0c;‌而是直接在原数组上进行操作。‌forEach方法不支持return、‌break、‌continue等语句&#xff0c;‌因为这些语句在forEach中不会…...

6.3 面向对象技术-设计模式

设计模式 创建型模式 结构型模式...

Mac 中安装内网穿透工具ngrok

ngrok 是什么&#xff1f; Ngrok 是一个网络工具&#xff0c;主要用于在网络中创建从公共互联网到私有或本地网络中运行的web服务的安全隧道。它充当了一个反向代理&#xff0c;允许外部用户通过公共可访问的URL访问位于防火墙或私有网络中的web应用程序或服务。Ngrok 特别适用…...

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数&#xff0c;可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法&#xff1a; S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数&#xff0c;…...

mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac

随着使用时间的增长&#xff0c;mac电脑会积累一些不必要的垃圾文件&#xff0c;这些文件会占用宝贵的存储空间&#xff0c;影响电脑的运行速度和稳定性。因此&#xff0c;定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件&#xff0c;包括一些出色的国…...

学生党百元蓝牙耳机哪个性价比高?精选四款超强性价比耳机型号

现阶段&#xff0c;蓝牙耳机技术逐渐成熟&#xff0c;蓝牙耳机在我们的学习和娱乐中承担着很重要的角色&#xff0c;那么在面对众多品牌和型号中&#xff0c;学生党们在选择蓝牙耳机上纠结不已&#xff0c;到底学生党百元蓝牙耳机哪个性价比高&#xff1f;作为一个蓝牙耳机重度…...

中文之美,美在辞藻富丽,也美在情感含蓄内敛。

文章目录 引言句句不提幸福,句句都是幸福句句不提释怀,句句都是释怀句句不提爱意,句句都是爱意句句不提安慰,句句都是安慰句句不提遗憾,句句都是遗憾句句不提思念,句句都是思念引言 许多句子没有将主题直抒胸臆,却通过字词间的呼应、碰撞,让人感受到“言未表而意无穷”…...

FPGA与ASIC:深入解析芯片设计的双子星

前言 在半导体世界里&#xff0c;FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;与ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;专用集成电路&#xff09;是两种截然不同的芯片设计策略&#xff0c;各自在…...

深入 Symfony 服务容器:依赖注入的艺术

“深入 Symfony 服务容器&#xff1a;依赖注入的艺术” 是一个涵盖了 Symfony 服务容器核心概念和依赖注入机制的复杂话题。为了全面理解 Symfony 服务容器的运作&#xff0c;我们将详细探讨以下几个方面&#xff1a; 服务容器的概念和作用依赖注入的基本原理Symfony 服务容器…...

基于Java+SpringMvc+Vue技术的慈善捐赠平台设计与实现(源码+LW+部署讲解)

项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;java 前端技术&#xff1a;JavaScript、VUE.j…...

dsp c6657 SYS/BIOS学习笔记

1 SYS/BIOS简介 SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统&#xff08;RTOS&#xff09;。 2 任务 2.1 任务调度 SYS/BIOS任务线程有0-31个优先级&#xff08;默认0-15&#xff0c;优先级0被空闲线程使用&#xff0c;任务最低优先级为1&#xff0c;最高优先级为15&am…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...