C#实现串口通讯

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

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;//静态定义COM2
        private static SerialPort _serialPort1 = null;//静态定义COM1
        private 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩,可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性,可以创建独特的效果,比如圆形、渐变…

华为云Windows Server服务器下,Node使用pm2-logrotate分割pm2日志,解决pm2日志内存占用过高的问题。

一、简介 PM2 是一个守护进程管理器,它将帮助您管理和保持您的应用程序在线。PM2 入门很简单,它以简单直观的 CLI 形式提供,可通过 NPM 安装。官网地址:https://pm2.keymetrics.io/ 二、问题:pm2日志内存占用过高&am…

uniapp 添加分包页面,配置分包预下载

为什么要分包 ? 分包即将小程序代码分成多个部分打包,可以减少小程序的加载时间,提升用户体验 添加分包页面 比较便捷的方法是使用vscode插件 uni-create-view 新建分包文件夹 以在我的页面,添加分包的设置页面为例,新建文件夹 s…

Nature | 大型语言模型(LLM)能够产生和发现新知识吗?

大型语言模型(LLM)是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络,这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义,并理解其中的单词和短语之间的关系。通…

nginx userid到底做了啥?

我们公司在用nginx的userid模块作为简单的用户请求追踪使用。这个模块其实并不能真正记录用户的请求状态,只能作为一个辅助使用。但是在一些场景下会有一些异常。下面我们简单介绍一下这个模块到底做了什么。 userid 模块简介 官网说明文档 ngx_http_userid_modul…

蓝桥杯c/c++程序设计——数位排序

数位排序【第十三届】【省赛】【C组】 题目描述 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。 当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如&#xff0…

CAD objectArx 在操作mfc时出现“不支持尝试执行的操作“

问题原因: ARX中对话框通常继承自CAcUiDialog,CAcUiDialog 构造函数有个参数 HINSTANCE hInstance,默认为 NULL,指定了对话框资源所在DLL进程。如果没有指定该参数,在创建对话框(DoModal或Create&#xff…

竞赛保研 基于RSSI的室内wifi定位系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 wifi室内定位系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:…

ip addr和ifconfig

ip addr可以显示更多信息,包括为启动的网络驱动如wlan,而ifocnfig只显示在线的驱动。若wlan是down的,则ip addr会显示信息,ifconfig不会显示信息。 ip addr: ifconfig:

网络通信协议

WebSocket通信 WebSocket是一种基于TCP的网络通信协议,提供了浏览器和服务器之间的全双工通信(full-duplex)能力。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接&#xff…

定制TikTok引流脚本必备功能!

在TikTok的海洋中,如何让你的品牌或产品脱颖而出?除了内容创新,一个高效的TikTok引流脚本也是关键,本文将为你揭示定制TikTok引流脚本必备的四大功能,助你在这场流量大战中占得先机。 一、消息多发 在TikTok上,消息…

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

鸿蒙的基本入门理解

一、鸿蒙工具的安装: 1、安装:官网 按照官网的步骤,按照好后,可以直接使用previewer预览就可以了【刚入门,不建议大家搞得太多,容易晕】。 如果预览不了,再安装模拟器 2、新建项目&#xff…

企业门户平台全功能解析:从界面到集成,一站式管理与整合

引言 在当今信息时代,企业门户平台作为企业信息化的重要支柱,扮演着连接各项业务、整合数据、提升工作效率的关键角色。它不仅是一个信息集成的平台,更是促进团队协作、提高工作效率的利器。本文将探讨企业门户平台在信息整合和工作效率方面…

故障管理过程

故障管理 故障管理在故障生命周期中的位置 分维度统计分析规律,形成系统化的改进方向跟进每个case的改进方案,彻底消除隐患前事不忘后事之师,供后续参考 故障定级 事故级别服务级别一般事故严重事故重大事故特大事故对外完全停止服务时间一…

大模型工具:LangChain 原理与实战案例

LangChain 是什么? LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使得可以构建以下类型的应用程序: 数据感知:将语言模型与其他数据源连接起来 智能:允许语言模型与其环境进行交互 LangChain的主要价值在于&…

亚信安慧AntDB数据库携手U8C共创未来

AntDB数据库生态负责人在近期举行的商业创新大会上引领着数字化时代的浪潮,推出了令业界瞩目的U8CAntDB联合产品。这一创新性的合作将AntDB数据库与U8C云ERP产品紧密结合,为成长型企业提供了一套全栈、安全可靠的保障,为企业的数智化转型升级…

新/旧版本 QT 下载,全攻略【省资源下载币专用】

看到好多朋友找不到指定版本的QT下载路径,特此更新一篇新/旧版本 QT 下载攻略 收藏一下吧,需要的时候方便查找,能为你省下好多资源下载币。 通过图示可以看出,新旧版本的界限并没有那么明晰,如果你需要的版本两个链接…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

内网MSF--从入门到熟练

Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework,简称叫做MSF。Metasploit 作为全球最受欢迎的工具,不仅仅是因为它的方便性和强大性,更重要的是它的框架。它允许使用者开 发自己的漏洞脚本,从而进行测试。 一…