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

相关推荐
Bruce_Liuxiaowei26 分钟前
技嘉Aorus主板Win10引导故障深度修复:从网络重置到注册表移植
服务器·网络·windows·microsoft
@insist12328 分钟前
网络工程师-网络攻击类型识别与防御体系:软考网络工程师核心考点
网络·网络工程师·软考·软件水平考试
Lucis__29 分钟前
Linux网络:基于协议栈原理实现UDP通信
linux·网络·udp
狂奔蜗牛(bradley)1 小时前
使用数组重构责任链实现通信协议解析
网络·mcu·重构
风逸尘_lz1 小时前
05-LPB3568针对不同网段实现UDP通信
网络·网络协议·udp
学编程就要猛2 小时前
JavaEE初阶:网络编程
运维·服务器·网络
北京聚信万通科技有限公司2 小时前
北京聚信万通科技有限公司获Odette CA官方授权,成为中国区“Odette ID及数字证书”官方注册审批管理机构
网络·科技·汽车·edi·电子数据交换·国产软件
2501_948114242 小时前
Claude Sonnet 4.6 深度评测:性能逼近 Opus、成本打骨折,附接入方案与选型指南
大数据·网络·人工智能·安全·架构
TOWE technology2 小时前
智能PDU——电力分配与数据信息的价值
网络·科技·pdu·智能pdu
humors2212 小时前
一些安全类网站(不定期更新)
linux·网络·windows·安全·黑客·白帽