串口之间通信一般都是一对出现的,下面我将介绍COM1和COM2.
COM1界面:
代码:
using System;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text;
namespace 串口通信
{
public partial class Form2 : Form
{
// 定义一个 SerialPort 类型的字段,用于表示串口对象
SerialPort serialPort;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 创建一个新的 SerialPort 对象
serialPort = new SerialPort();
// 设置串口号为 COM1,可以根据实际情况修改
serialPort.PortName = "COM1";
// 设置波特率为 9600
serialPort.BaudRate = 9600;
// 设置校验位为无校验
serialPort.Parity = Parity.None;
// 设置数据位为 8 位
serialPort.DataBits = 8;
// 设置停止位为 1 位
serialPort.StopBits = StopBits.One;
try
{
// 尝试打开串口
serialPort.Open();
// 如果打开成功,弹出消息框提示
MessageBox.Show("串口已成功打开!");
}
catch (Exception ex)
{
// 如果打开失败,弹出消息框显示错误信息
MessageBox.Show($"打开串口时出错: {ex.Message}");
}
}
private void button2_Click(object sender, EventArgs e)
{
// 如果串口已经打开
if (serialPort.IsOpen)
{
// 注册串口数据接收事件
serialPort.DataReceived += SerialPort_DataReceived;
}
else
{
// 如果串口未打开,弹出消息框提示
MessageBox.Show("串口未打开,请先打开串口!");
}
}
// 处理串口数据接收的事件处理方法
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 创建一个字节数组,长度为当前串口缓冲区中的字节数
byte[] buffer = new byte[serialPort.BytesToRead];
// 从串口读取数据到缓冲区
serialPort.Read(buffer, 0, buffer.Length);
// 将接收到的字节数组转换为 UTF-8 编码的字符串
string receivedData = Encoding.GetEncoding("UTF-8").GetString(buffer);
// 使用 Invoke 方法在 UI 线程上更新标签的文本内容
textBox1.Invoke(new Action(() =>
{
label1.Text = receivedData;
}));
}
private void button3_Click(object sender, EventArgs e)
{
// 如果串口已经打开
if (serialPort.IsOpen)
{
// 获取文本框中的字符串数据
string data = textBox1.Text;
// 将字符串转换为 ASCII 编码的字节数组
byte[] bytes = Encoding.ASCII.GetBytes(data);
try
{
// 将字节数组写入串口
serialPort.Write(bytes, 0, bytes.Length);
}
catch (Exception ex)
{
// 如果写入数据时发生错误,弹出消息框显示错误信息
MessageBox.Show($"发送数据时出错: {ex.Message}");
}
}
else
{
// 如果串口未打开,弹出消息框提示
MessageBox.Show("串口未打开,请先打开串口!");
}
}
//这个是关闭串口,如果需要可以加上
private void CloseSerialPort()
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
MessageBox.Show("串口已关闭!");
}
}
}
}
COM2界面:
代码:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text;
// 命名空间:串口通信,这里包含了与串口通信相关的Form1类的定义
namespace 串口通信
{
public partial class Form1 : Form
{
public Form1()
{
// 初始化组件,这是在设计WinForm时自动生成的方法,用于初始化可视化界面的各个元素
InitializeComponent();
}
// 定义一个SerialPort类型的变量,用于操作串口
SerialPort serialPort;
private void button1_Click(object sender, EventArgs e)
{
// 创建一个新的SerialPort对象,用于配置和操作串口
serialPort = new SerialPort();
// 设置串口号为COM2,这里需要根据实际连接的串口进行修改
serialPort.PortName = "COM2";
// 设置波特率为9600,波特率是串口通信中数据传输的速率
serialPort.BaudRate = 9600;
// 设置校验位为无校验,校验位用于数据传输的错误检测
serialPort.Parity = Parity.None;
// 设置数据位为8位,数据位是实际传输数据的位数
serialPort.DataBits = 8;
// 设置停止位为1位,停止位用于表示数据帧的结束
serialPort.StopBits = StopBits.One;
try
{
// 尝试打开串口,如果打开成功则弹出提示框
serialPort.Open();
MessageBox.Show("串口已成功打开!");
}
catch (Exception ex)
{
// 如果打开串口过程中出现错误,弹出包含错误信息的提示框
MessageBox.Show($"打开串口时出错: {ex.Message}");
}
}
private void button2_Click(object sender, EventArgs e)
{
// 判断串口是否已经打开
if (serialPort.IsOpen)
{
// 如果串口已打开,为串口的DataReceived事件注册处理方法SerialPort_DataReceived
// 当串口接收到数据时,会触发该事件
serialPort.DataReceived += SerialPort_DataReceived;
}
else
{
// 如果串口未打开,弹出提示框告知用户
MessageBox.Show("串口未打开,请先打开串口!");
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 创建一个字节数组,其长度为当前串口缓冲区中可读的字节数
byte[] buffer = new byte[serialPort.BytesToRead];
// 从串口读取数据到缓冲区中
serialPort.Read(buffer, 0, buffer.Length);
// 将接收到的字节数组转换为UTF - 8编码的字符串
string receivedData = Encoding.GetEncoding("UTF - 8").GetString(buffer);
// 使用Invoke方法在UI线程上执行以下操作,因为在非UI线程中不能直接更新UI元素
textBox1.Invoke(new Action(() =>
{
// 将接收到的数据显示在label1上,这里可能是原作者的一个小失误,本意可能是更新textBox1的内容或者其他用于显示接收数据的控件
label1.Text = receivedData;
}));
}
private void button3_Click(object sender, EventArgs e)
{
// 判断串口是否打开
if (serialPort.IsOpen)
{
// 获取textBox1中的文本内容作为要发送的数据
string data = textBox1.Text;
// 将字符串转换为ASCII编码的字节数组,因为串口发送数据是以字节为单位
byte[] bytes = Encoding.ASCII.GetBytes(data);
try
{
// 通过串口发送字节数组数据
serialPort.Write(bytes, 0, bytes.Length);
}
catch (Exception ex)
{
// 如果发送数据过程中出现错误,弹出包含错误信息的提示框
MessageBox.Show($"发送数据时出错: {ex.Message}");
}
}
else
{
// 如果串口未打开,弹出提示框告知用户
MessageBox.Show("串口未打开,请先打开串口!");
}
}
//这个是关闭串口,如果需要可以加上
private void CloseSerialPort()
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
MessageBox.Show("串口已关闭!");
}
}
}
}