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
参考乘风破浪大神的帖子:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!