C#实现串口通讯

news2025/2/7 7:39:03

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

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

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

相关文章

Unity | 渡鸦避难所-4 | 镜头跟随角色移动

1 Cinemachine 简介 在第一人称视角的游戏中,摄像机需要时刻跟随角色移动。除了手动计算摄像机的位置、旋转外,也可以使用 Unity 提供的 Cinemachine 插件来轻松实现摄像机的控制 Cinemachine 是一套用于操作 Unity 相机的模块,解决了跟踪目…

【AI】阿里云免费GPU服务资源领取方法

首先,直接点击链接:阿里云免费试用 也可以复制链接到浏览器进行跳转:https://free.aliyun.com?userCodernbj0c1o 页面如下所示:这里的免费试用期限是3个月,给的资源点够我们试用V100 16G显存服务器300个小时&#xff…

【Java】智慧工地云平台管理系统源码

智慧工地平台-系统架构 •统一数据标准、规范数据接口 •决策支持:数据挖掘、全文搜索引擎、OLAP分析、统计报表 •智慧工地平台:项目人员管理、视频监控管理、安全隐患管理、现场物料管理、危大工程监测、绿色文明施工。 •物联网采集:人脸识…

Linux入门——环境 基本指令 基本工具 权限的初步认识

目录 1.Linux的历史 2.利用云服务器设置Linux 3.使用Xshell连接阿里云服务器 4.Linux常见的指令 5.什么是操作系统? 6.命令解释器 7. linux的权限的初步认识 8.相关习题的练习 1.Linux的历史 1991 年 10 月 5 日,赫尔辛基大学的一名研究生 Linus B…

解决企业TB或者PB级大文件传输速度和安全问题

随着企业数据不断增加,TB或PB级大文件的传输成为企业信息共享和数据备份的重要手段之一。然而,这些大文件的传输速度和安全问题成为制约企业发展的瓶颈,也是企业需要解决的重要问题。本文将探讨如何解决这些问题,并从以下几个方面…

基于Java SSM框架实现水果销售网站系统项目【项目源码+论文说明】

基于java的SSM框架实现水果销售网站系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&a…

Maven仓库依赖导入‘.lastUpadate‘问题解决

1. 依赖导入不进去先检查 当你开一个新的项目导入maven仓库的时候,发现本地有这个依赖,但是pom.xml文件里的依赖老是爆红,然后无论怎么样去reload->clean->install还是不行, 这时可以先去检查下maven的setting.xml文件和m…

CentOS8+宝塔面板+cpolar内网穿透搭建可公网访问的Typecho个人站点

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴。Typecho基于PHP5开发,支持多种数据库&#…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)

一、JWT简介 JWT 全称 JSON Web Token,JWT 主要用于用户登录鉴权,当用户登录之后,返回给前端一个Token,之后用户利用Token进行信息交互。 除了JWT认证之外,比较传统的还有Session认证,如何选择可以查看之前…

2024年【道路运输企业安全生产管理人员】考试题及道路运输企业安全生产管理人员报名考试

题库来源:安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员考试题考前必练!安全生产模拟考试一点通每个月更新道路运输企业安全生产管理人员报名考试题目及答案!多做几遍,其实通过道路运输企业安全生产管理人员…

web功能实例 - Canvas裁剪工具

嗯,手撸官方文档2天,发现没啥用,尤其是动画,那种计算出来的,根本想不到。因此学着学了抱着要做个东西的想法,去网上找相关案例,最终做出了这个裁剪工具。 PS :先说一下思路: 核心实现有3个canvas图层, 其中一个负责图片的预览。另外2个叠加到…

【深度学习】使用ffmpg及gstreamer进行视频拉流及编解码(一):ffmpg

目录 为什么要进行视频编解码网络带宽常见的视频编码格式视频分辨率及其占用的经验带宽千兆网口及百兆网口 硬件编解码和软件编解码的区别拉流工具简介安装ffmpg库安装必要的依赖库安装ffmpg库 代码 为什么要进行视频编解码 视频流需要编解码的主要原因是视频文件的数据量很大…

【深度学习】DataComp论文,数据集介绍,大数据模型的数据集介绍

参考: https://laion.ai/blog/datacomp/ 论文:https://arxiv.org/abs/2304.14108 文章目录 论文报告的一些内容datacomp-1B 数据质量比lainon2B要好不同规模数据有多少数据数据处理数据来源 论文报告的一些内容 摘要 多模态数据集是近期如CLIP、Stable …

python 安装django 构建django项目

背景 项目需要,构建一个可视化平台,在参与技术调研后决定选用django作为主要技术栈。 内容 通过Python安装django,我这里的pycharm和Python版本有点低,所有没有通过pycharm页面入口进行创建django项目。 pip install django 安装…

MYSQL一一函数一一流程函数

咱今天讲的是MySQL函数中的流程函数,会有3小题和一个综合案例帮助大家理解 流程函数是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率 小题: ①if语句: select if(flash,ok,error); //如果…

Dash中的callback的使用 多input 6

代码说明 import plotly.express as pxmport plotly.express as px用于导入plotly.express模块并给它起一个别名px。这样在后续的代码中,你可以使用px来代替plotly.express,使代码更加简洁。 plotly.express是Plotly的一个子模块,用于快速创…

QT foreach

原型:foreach(variable, container) container:容器,即被遍历的对象 variable:当前元素,即遍历container过程中,当前的那个元素 代码: QStringList container { "1", "2&quo…

CRM管理系统是怎样分析客户行为的?CRM客户管理功能解析

轻霜冻死单根草,狂风难毁万亩林。拥有坚实客户基础的企业即使面对日趋白热的市场竞争也依然能够勇立潮头。CRM管理系统是维系客户的重要工具之一。CRM管理系统是怎样辅助企业实现客户管理的?我们可以拆解为以下几个方面:1.客户信息管理 2.数据…

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解,觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法,一些更先进的防火墙还可以采用其他防御措施,例如:深度包检测、行为分析、人工智能等,来识别和防御各…

AGV|RGV小车RFID传感器CNS-RFID-01/1S的RS232通讯联机方法

CNS-RFID-01/1S广泛应用于AGV小车,搬运机器人,无人叉车等领域,用于定位,驻车等应用,可通过多种通讯方式进行读写操作,支持上位机控制,支持伺服电机,PLC等控制设备联机,本…