C#实现串口通讯

1、官网下载Launch Virtual Serial Port Driver  Virtual Serial Port Driver - create and emulate virtual COM port,开个虚拟串口: Pair模式(一对,成双成对的意思,就是COM1向COM2传或者COM2向COM1,好比两台机器的COM口连起来了,一头一个),用"trial"实验模式就行。

给个传送门吧:链接:https://pan.baidu.com/s/1m7_u9tmMeShjeW642jm0Cg 
提取码:xvg0

2、用“小阳人”串口tcp工具测试下。

传送门

链接:https://pan.baidu.com/s/1ptQiCBhziXHfTM4hZ4XaFw 
提取码:axw9

它长这样

一下子打开俩,模拟下,测测串口好使不。

互相发都能收到。ok

3、写winform程序,实现下。 

页面效果(非常简易。。。)

直接上代码:

里面是三个按钮的实现,只用到一个其实。就是“从COM2向COM1发送数据”,“从COM1”我还是从"从COM2向COM1发送数据"又发了一遍,哈哈哈

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace read6
{public partial class Form1 : Form{private static SerialPort _serialPort = null;//静态定义COM2private static SerialPort _serialPort1 = null;//静态定义COM1private static bool _continue;public Form1(){InitializeComponent();}public static void Read(){while (_continue){try{string message = _serialPort1.ReadLine();Console.WriteLine($"接收到消息:{message}");}catch (TimeoutException) { }}}//注册的接受事件private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){SerialPort sp = (SerialPort)sender;string message = sp.ReadExisting();Console.WriteLine($"接收到消息:{message}");}private static void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e){Console.WriteLine($"串口消息错误类型:{e.EventType}");}//参数调试的按钮的点击事件,主要看下都是些啥默认值 比特率啥的private void button1_Click(object sender, EventArgs e){var _serialPort = new SerialPort();_serialPort.PortName = "COM2";foreach (var portName in SerialPort.GetPortNames()){Console.WriteLine($"可用端口:{portName}");}var defaultPortName = _serialPort.PortName;Console.WriteLine($"默认端口:{defaultPortName}");var defaultBaudRate = _serialPort.BaudRate;Console.WriteLine($"默认串行波特率:{defaultBaudRate}");var defaultParity = _serialPort.Parity;Console.WriteLine($"默认奇偶校验检查协议:{defaultParity}");foreach (var parity in Enum.GetNames(typeof(Parity))){Console.WriteLine($"可选奇偶校验检查协议:{parity}");}var defaultDataBits = _serialPort.DataBits;Console.WriteLine($"默认每个字节的标准数据位长度:{defaultDataBits}");var defaultStopBits = _serialPort.StopBits;Console.WriteLine($"默认每个字节的标准停止位数:{defaultStopBits}");foreach (var stopBit in Enum.GetNames(typeof(StopBits))){Console.WriteLine($"可选每个字节的标准停止位数:{stopBit}");}var defaultHandshake = _serialPort.Handshake;Console.WriteLine($"默认串行端口数据传输的握手协议:{defaultHandshake}");foreach (var handshake in Enum.GetNames(typeof(Handshake))){Console.WriteLine($"可选串行端口数据传输的握手协议:{handshake}");}}private static void PortDataAdapter_MessageReceived(object sender, PortMessageEventArgs e){}private void textBox1_TextChanged(object sender, EventArgs e){}//从COM2向COM1发送数据按钮的点击事件private void button2_Click(object sender, EventArgs e){if (_serialPort == null){_serialPort = new SerialPort();_serialPort.PortName = "COM2";_serialPort.Open();}if (_serialPort1 == null){_serialPort1 = new SerialPort();_serialPort1.PortName = "COM1";_serialPort1.Open();_serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);//注册监听事件,COM1接收监听}Console.WriteLine($"串口是否开启:{_serialPort.IsOpen},端口名称:{_serialPort.PortName}");Console.WriteLine($"串口是否开启:{_serialPort1.IsOpen},端口名称:{_serialPort1.PortName}");_serialPort.WriteLine(textBox1.Text);Console.WriteLine("从COM2向COM1发送数据" + textBox1.Text);}//COM1发送的按钮实现private void button3_Click(object sender, EventArgs e){_serialPort.WriteLine(textBox2.Text);Console.WriteLine("从COM2向COM1发送数据" + textBox2.Text);}private void textBox2_TextChanged(object sender, EventArgs e){}}
}

效果打印:

点击“从COM2向COM1发送数据”

“read6.exe”(CLR v4.0.30319: read6.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
“read6.exe”(CLR v4.0.30319: read6.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Accessibility\v4.0_4.0.0.0__b03f5f7f11d50a3a\Accessibility.dll”。
串口是否开启:True,端口名称:COM2
串口是否开启:True,端口名称:COM1
接收到消息:111111111111122

从COM2向COM1发送数据111111111111122

串口是否开启:True,端口名称:COM2
串口是否开启:True,端口名称:COM1
接收到消息:43333

从COM2向COM1发送数据43333
 

COM2发多少COM1收多少。 

额 不知道为啥先打印的收到。。hh 。

源码传送门:sunyl/COM2toCOM1

参考乘风破浪大神的帖子:

https://www.cnblogs.com/taylorshi/p/16930251.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程期末复习

● 用例:借书 ●参与者:管理员,借阅者 ●操作流: ① 管理员进入图书借阅界面,用例开始。 ② 系统要求输入借阅者的借书证编码。 ③系统检验借书证编码,如果正确,则显示借阅者的信息。 A1:借书证编码有错。 A2: 如果该借…

巨量引擎大众消费发布“十佳好课”榜单:涵盖五大行业 助力商家进阶

2023,中国消费市场出现温和复苏态势,在不确定市场环境下,大众消费商家如何用好科学营销手段,实现确定性增长?如何紧跟平台趋势,把握生意增长先机? 为了给商家持续提供前沿适配的营销方法、解决实际生意卡点&#xff…

MYSQL一一函数一一字符串函数

嘿嘿大家好我回来啦,今天我们要学习的是MYSQL中的函数,函数呢我们又分为字符串函数,数值函数,日期函数,流程函数来介绍,今天重点介绍字符串函数(从小题到案例方便你们更加深入的理解) 函数指的是一段可以直…

软件测试面试题合集,金三银四offer稳了。。。

前言 前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些…

nginx源码分析-1

使用gdb查看函数上下文: gdb attach nginx的work线程 监听端口状态时: 断点打在ngx_http_process_request 并通过浏览器触发请求时:

在linux下添加中文输入

一共三个步骤,过程中有参考Linux最详细且好用的安装中文输入法教程 - 知乎 1. 打开左侧的software下载安装Fcitx 2. 点击左下侧搜索language support,把keyboard input method system改成Fcitx 4 3. input source把中文放在最前面 成功&#xff0…

基于openGauss5.0.0全密态数据库等值查询小案例

基于openGauss5.0.0全密态数据库等值查询小案例 一、全密态数据库简介二、环境说明三、测试步骤四、使用约束 一、全密态数据库简介 价值体现: 密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传…

Web 3.0 是什么

第 1 章 明晰Web 3.0 从本章开始,就进入了本书的第一篇章,入门Web3.0,在第一篇章中将会让读者对Web3.0有一个整体的认知,为学习后面的章节打下基础。 在本章中,主要介绍的是Web的发展历史,包涵Web1.0、Web2.0、Web3.0的发展过程,以及资本为什么需要入场Web3.0、Web3.0…

遗传算法的应用——求解一元函数的极值

遗传算法的应用——求解一元函数的极值 1 基本概念2 预备知识3.1 模拟二进制转化为十进制的方法3.2 轮盘赌选择算法 3 问题4 Matlab代码5 运行效果6 总结 1 基本概念 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中遗传和进化过程从而形成的随机全局搜索和优化方法&am…

1. pytorch mnist 手写数字识别

文章目录 一、数据集介绍1.1、简介1.2 详细介绍1、数据量2、标注量3. 标注类别4.数据下载5.数据集解读 二、读取、加载数据集1、pytorch 自带库函数2、通过重构Dataset类读取特定的MNIST数据或者制作自己的MNIST数据集 三、模型构建四、 runtraintest评估模型的性能检查点的持续…

Postman接口测试(附教程)

前言 之前还没实际做过接口测试的时候呢,对接口测试这个概念比较渺茫,只能靠百度,查看各种接口实例,然后在工作中也没用上,现在呢是各种各样的接口都丢过来…

2024,智能汽车走出独立曲线

文|刘俊宏 新能源汽车正在带领中国车市走向新的高峰。 在2023年,新能源汽车的增速显著超越整体车市。据中汽协预测,2023年,汽车总销量有望突破3000万辆,同比增长11.7%。其中,乘用车预计达到2600万辆&…

Web(10)XSS漏洞

XSS跨站脚本攻击 XSS是什么 XSS(cross-site-scripting) 即是跨站脚本攻击,是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端…

一条查询SQL是如何执行的?更新、新增、删除呢?

你好,我是田哥 本文共14629字,读完预计需要37分钟,建议先收藏。 大部分朋友估计都只知道写sql然后执行,但是并不知道MySQL背后到底是怎么实现的。 八股文中也有这么一道题:在MySQL中,一条SQL到底是如何执行…

【记录问题排查系列】记录CPU飙高问题排查过程篇(1)

CPU飙高问题排查 ✔️问题排查与解决✔️总结与思考 🍁前段时间我们新上了一个新的应用,因为流量一直不大,集群OPS大概只有5左右,写接口的t在30ms左右。 因为最近接入了新的业务,业务方给出的数据是日常QPS可以达到20…

无人职守自动安装linux操作系统

无人职守自动安装linux操作系统 1. 大规模部署案例2. PXE 技术3. Kickstart 技术4. 配置安装服务器4.1 DHCP服务4.2 TFTP 服务4.3 NFS服务 5. 示例5.1 搭建server1. 启动dhcp并设为开机自启2. 设置并启动tftp3. 将客户端所需启动文件复制到TFTP服务器4. 创建Kickstart自动应答文…

【IO】IO模型与零拷贝

前言: 正在运行的程序其实就是系统中的一个进程,操作系统会为每一个进程分配内存空间,而内存空间分为两部分,一部分是用户空间,这是用户进程访问的内存区域;另一部分是内核空间,是操作系统内核访…

20种常用的软件测试方法,建议先收藏再观看

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

简单的喷淋实验(2):(1)根据土壤湿度自动控制喷淋开关;(2)根据光照强度控制风扇以及灯的开关---嵌入式实训

目录 简单的喷淋实验(2): (1)根据土壤湿度自动控制喷淋开关; (2)根据光照强度控制风扇以及灯的开关---嵌入式实训 任务2: 具体过程: 所用的头文件: data_global.h …

gin框架使用系列之三——获取表单数据

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》 一、获取get参数 get请求的参数是直接加在url后面的,在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法,示例代码如下…