C#中串口SerialPort通信

串口之间通信一般都是一对出现的,下面我将介绍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("串口已关闭!");
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值