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客户端/服务端、串口通信 背景 日常练习,着急换工作,心态都快乱了。 工具 串口调试助手 网络调试助手 代码 客户端 using Microsoft.VisualBasic.Logging; using System.Net.Sockets; using System.Text;namespace TcpClientDem…...
Linux基础复习(二)
前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root,则最后一个字符为# 否则,最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…...
nginx漏洞修复 ngx_http_mp4_module漏洞(CVE-2022-41742)【低可信】 nginx版本升级
风险描述: Nginx 是一款轻量级的Web服务器、反向代理服务器。 Nginx 的受影响版本中的ngx _http_mp4_module模块存在内存越界写入漏洞,当在配置中使用 mp4 directive时,攻击者可利用此漏洞使用使用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算法之递归算法-如何计算阶乘的值
上一篇学了递归之后,练习一下递归算法。 题目:使用递归算法计算阶乘的值,也就是5!5*4*3*2*1,直接使用循环是非常简单的,这边练习一下递归算法。 先写一下两个条件 基线条件:等于1的时候返回1…...
python爬虫入门小案例
python爬虫 以下内容仅供学习交流,请勿用作其他用途,若涉及隐私和版权问题,请及时联系我删除 闲来无事,学了学爬虫小知识,适合入门,文笔拙劣,还望见谅 爬虫是什么: 爬取网页上的文字,图片,视频,音频 自动化操作浏览器,比如填写表单,打卡,提高工作效率爬虫的注意事项: 爬虫…...
【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程
昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分: 1)计算类:矩阵计算单元(两个矩阵扔进去相乘)、向量计算单元、标量计算单元 2)控…...
系统架构设计师教程 第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,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积 二、编写程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符 三、输入4个整数,要求按由小…...
map、foreach、filter这些方法你还不知道什么时候该用哪个吗?那就看过来
forEach:主要用于遍历数组并对每个元素执行某种操作,通常用于改变当前数组里的值。它不会返回新数组,而是直接在原数组上进行操作。forEach方法不支持return、break、continue等语句,因为这些语句在forEach中不会…...
6.3 面向对象技术-设计模式
设计模式 创建型模式 结构型模式...
Mac 中安装内网穿透工具ngrok
ngrok 是什么? Ngrok 是一个网络工具,主要用于在网络中创建从公共互联网到私有或本地网络中运行的web服务的安全隧道。它充当了一个反向代理,允许外部用户通过公共可访问的URL访问位于防火墙或私有网络中的web应用程序或服务。Ngrok 特别适用…...
python count返回什么
描述 count() 方法用于统计字符串中某个子字符串出现的次数,可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法: S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数,…...
mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac
随着使用时间的增长,mac电脑会积累一些不必要的垃圾文件,这些文件会占用宝贵的存储空间,影响电脑的运行速度和稳定性。因此,定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件,包括一些出色的国…...
学生党百元蓝牙耳机哪个性价比高?精选四款超强性价比耳机型号
现阶段,蓝牙耳机技术逐渐成熟,蓝牙耳机在我们的学习和娱乐中承担着很重要的角色,那么在面对众多品牌和型号中,学生党们在选择蓝牙耳机上纠结不已,到底学生党百元蓝牙耳机哪个性价比高?作为一个蓝牙耳机重度…...
中文之美,美在辞藻富丽,也美在情感含蓄内敛。
文章目录 引言句句不提幸福,句句都是幸福句句不提释怀,句句都是释怀句句不提爱意,句句都是爱意句句不提安慰,句句都是安慰句句不提遗憾,句句都是遗憾句句不提思念,句句都是思念引言 许多句子没有将主题直抒胸臆,却通过字词间的呼应、碰撞,让人感受到“言未表而意无穷”…...
FPGA与ASIC:深入解析芯片设计的双子星
前言 在半导体世界里,FPGA(Field-Programmable Gate Array,现场可编程门阵列)与ASIC(Application-Specific Integrated Circuit,专用集成电路)是两种截然不同的芯片设计策略,各自在…...
深入 Symfony 服务容器:依赖注入的艺术
“深入 Symfony 服务容器:依赖注入的艺术” 是一个涵盖了 Symfony 服务容器核心概念和依赖注入机制的复杂话题。为了全面理解 Symfony 服务容器的运作,我们将详细探讨以下几个方面: 服务容器的概念和作用依赖注入的基本原理Symfony 服务容器…...
基于Java+SpringMvc+Vue技术的慈善捐赠平台设计与实现(源码+LW+部署讲解)
项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑! 软件开发环境及开发工具: 操作系统:Windows 10、Windows 7、Windows 8 开发语言:java 前端技术:JavaScript、VUE.j…...
dsp c6657 SYS/BIOS学习笔记
1 SYS/BIOS简介 SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统(RTOS)。 2 任务 2.1 任务调度 SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1,最高优先级为15&am…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
