c#串口通信初接触

本文详细介绍了串口通信的基本概念,包括串口的功能及其在数据传输中的应用,并提供了使用C#进行串口通信的实践教程,涵盖串口的创建、连接、发送与接收数据的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是串口及串口通信?

串口全称串行接口,是采用串行通信方式的扩展接口。
在这里插入图片描述
通俗的来说,例如我们电脑等设备用的USB接口类似,串口功能类似USB,都是用于数据传输的工具,也是一种非常通用的设备通信协议。
串口通信就是计算机和外设之间通过数据线相连按位传输数据,通过向串口发送的电信号可以控制终端器械以及设备。比如我们用电脑给单片机发送指令,就是USB转串口来控制单片机的方式。

如何理解串口,UART, RS232, RS485?:
https://www.zhihu.com/question/273655897/answer/370147444

2.创建模拟串口

一开始我们接触串口的时候,电脑不一定有现成的串口可以用,就要添加模拟串口来做接下来的工作。
在网上找到一个可用的模拟软件。
csdn下载:
https://download.youkuaiyun.com/download/Yyuanyuxin/12373033

百度云下载:
链接:https://pan.baidu.com/s/1kf1VEgdQ1ABT35230RNuhQ
提取码:l6mu
该软件有点小bug,有的显示不全,但是不影响操作。

操作步骤很简单。
在这里插入图片描述
下图可以看到新增了几个模拟的串口
在这里插入图片描述

3.使用c#下的SerialPort来简单进行通信

(1)连接

SerialPort sp=new SerialPort();
sp.PortName = "COM1";
sp.BaudRate = 115200;
sp.DataBits = 8;
sp.StopBits = (StopBits)1;
sp.ReadTimeout = 5;
sp.Open();

上面的属性:

属性说明
PortName串口名, 默认值COM1
BaudRate串行波特率bit/s ,默认值9600
DataBits每个字节的标准数据位长度,默认值8
StopBits每个字节的标准停止位数,用于表示单个包的最后一位,默认值One
Parity奇偶校验检查协议,简单的检错方式,默认值None

(2)关闭

 sp.Close();

(3)发送

public void SendData()
{
    try
    {
        sp.Encoding = EncodingType;
        sp.Write(richTextBox1.Text));
    }
    catch (Exception e)
    {
        throw e;
    }
}

(4)接收
绑定接收事件:

 sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
     byte[] buffer = new byte[sp.BytesToRead];
     sp.Read(buffer, 0, buffer.Length);
     string str = EncodingType.GetString(buffer);
     this.Invoke(new EventHandler(delegate
       {
           richTextBox2.AppendText($"接收:{str}\n");
       }));

 }

4.使用帮助类来简化代码

帮助类:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 串口操作
{

    class PortCommunicationHelper
    {
        //创建串口对象
        public SerialPort serialPort;

        /// <summary>
        /// 端口名称数组
        /// </summary>
        public string[] PortNameArr { get; set; }

        /// <summary>
        /// 串口通信开启状态
        /// </summary>
        //public bool PortState { get; set; } = false;

        /// <summary>
        /// 编码类型
        /// </summary>
        public Encoding EncodingType { get; set; } = Encoding.UTF8;

        /// <summary>
        /// 串口接收数据委托
        /// </summary>
        public delegate void ComReceiveDataHandler(string data);

        public ComReceiveDataHandler OnComReceiveDataHandler = null;

        public PortControlHelper()
        {
            PortNameArr = SerialPort.GetPortNames();
            serialPort = new SerialPort();
            serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
        }

        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sendData"></param>
        public void SendData(string sendData)
        {
            try
            {
                serialPort.Encoding = EncodingType;
                serialPort.Write(sendData);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 打开串口口
        /// </summary>
        public void openPort(string name)
        {
            serialPort.PortName = name;
            serialPort.BaudRate = 115200;
            serialPort.DataBits = 8;
            serialPort.StopBits = (StopBits)1;
            serialPort.ReadTimeout = 5;
            serialPort.Open();
        }

        /// <summary>
        /// 关闭端口
        /// </summary>
        public void ClosePort()
        {
            try
            {
                serialPort.Close();
                //PortState = false;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 接收数据回调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] buffer = new byte[serialPort.BytesToRead];
            serialPort.Read(buffer, 0, buffer.Length);
            string str = EncodingType.GetString(buffer);
            if (OnComReceiveDataHandler != null)
            {
                OnComReceiveDataHandler(str);
            }
        }

    }
}

窗口显示及代码:
在这里插入图片描述
代码:

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.Tasks;
using System.Windows.Forms;

namespace 串口操作
{
    public partial class Form1 : Form
    {
        private PortCommunicationHelper pchSend;
        private PortCommunicationHelper pchReceive;
        public Form1()
        {
            InitializeComponent();
            pchSend = new PortCommunicationHelper();
            pchReceive = new PortCommunicationHelper();
            Init();
        }
        /// <summary>
        /// 打开串口
        /// </summary>
        /// 
        void Init()
        {
            try
            {
                pchSend.openPort("COM1");
                pchReceive.openPort("COM2");
                

                pchReceive.OnComReceiveDataHandler += new PortCommunicationHelper.ComReceiveDataHandler(ComReceiveData);
            }
            catch (Exception)
            {
                MessageBox.Show("串口通信异常");
                throw;
            }


        }
        /// <summary>
        /// 接收到的数据,写入文本框内
        /// </summary>
        /// <param name="data">接受的数据</param>
        private void ComReceiveData(string data)
        {

            this.Invoke(new EventHandler(delegate
            {
                richTextBox2.AppendText($"接收:{data}\n");
            }));
        }

        private void button2_Click(object sender, EventArgs e)
        {
            pchSend.SendData(richTextBox1.Text);
        }
    }
}

源码下载:
https://download.youkuaiyun.com/download/Yyuanyuxin/12373328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yyuanyuxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值