当前位置: 首页 > 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;}}}
}

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

相关文章:

  • Elasticsearch:Golang ECS 日志记录 - zerolog
  • 【PyTorch】单目标检测项目部署
  • js+css侧边导航菜单 可收缩
  • 【数据结构】排序算法——Lesson2
  • 树莓派自制智能语音助手之语音唤醒
  • 《人生苦短,我用python·十一》python网络爬虫的简单使用
  • 基于Hutool实现自定义模板引擎,实现json个性化模板引擎转换
  • 机器学习 | 回归算法原理——最小二乘法
  • SQL labs-SQL注入(三)
  • 离散型以及连续型随机变量
  • 【JVM基础05】——组成-能不能解释一下方法区?
  • 手机如何播放电脑的声音?
  • Django 简介
  • Unity UGUI 之 Slider
  • .NET开源、简单、实用的数据库文档生成工具
  • Cumulo 的 ClojureScript 模块已经成型
  • Django 博客开发教程 16 - 统计文章阅读量
  • Odoo domain写法及运用
  • PHP CLI应用的调试原理
  • Phpstorm怎样批量删除空行?
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • yii2权限控制rbac之rule详细讲解
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 后端_MYSQL
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 学习使用ExpressJS 4.0中的新Router
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 最简单的无缝轮播
  • Prometheus VS InfluxDB
  • #AngularJS#$sce.trustAsResourceUrl
  • #include
  • #stm32驱动外设模块总结w5500模块
  • $forceUpdate()函数
  • (C++)八皇后问题
  • (C++17) optional的使用
  • (Java)【深基9.例1】选举学生会
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (九)信息融合方式简介
  • (篇九)MySQL常用内置函数
  • (一)Linux+Windows下安装ffmpeg
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .env.development、.env.production、.env.staging
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET gRPC 和RESTful简单对比
  • .NET 快速重构概要1
  • .NET 使用配置文件
  • .NET中的Exception处理(C#)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @AliasFor注解
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @reference注解_Dubbo配置参考手册之dubbo:reference