单片机学习小组
直播中

凌晨3点睡

13年用户 562经验值
私信 关注

怎样使用c#下的SerialPort来简单进行串口通信呢

什么是串口及串口通信?如何理解串口、UART、RS232、RS485呢?怎样使用c#下的SerialPort来简单进行串口通信呢?

回帖(1)

李鑫

2022-2-16 11:18:35
1.什么是串口及串口通信?


串口全称串行接口,是采用串行通信方式的扩展接口。

通俗的来说,例如我们电脑等设备用的USB接口类似,串口功能类似USB,都是用于数据传输的工具,也是一种非常通用的设备通信协议。
串口通信就是计算机和外设之间通过数据线相连按位传输数据,通过向串口发送的电信号可以控制终端器械以及设备。比如我们用电脑给单片机发送指令,就是USB转串口来控制单片机的方式。
如何理解串口,UART, RS232, RS485?:

2.创建模拟串口

一开始我们接触串口的时候,电脑不一定有现成的串口可以用,就要添加模拟串口来做接下来的工作。
在网上找到一个可用的模拟软件。
该软件有点小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();


上面的属性:
[tr]属性说明[/tr]
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;


        ///
        /// 端口名称数组
        ///

        public string[] PortNameArr { get; set; }


        ///
        /// 串口通信开启状态
        ///

        //public bool PortState { get; set; } = false;


        ///
        /// 编码类型
        ///

        public Encoding EncodingType { get; set; } = Encoding.UTF8;


        ///
        /// 串口接收数据委托
        ///

        public delegate void ComReceiveDataHandler(string data);


        public ComReceiveDataHandler OnComReceiveDataHandler = null;


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


        ///
        /// 发送数据
        ///

        ///
        public void SendData(string sendData)
        {
            try
            {
                serialPort.Encoding = EncodingType;
                serialPort.Write(sendData);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        ///
        /// 打开串口口
        ///

        public void openPort(string name)
        {
            serialPort.PortName = name;
            serialPort.BaudRate = 115200;
            serialPort.DataBits = 8;
            serialPort.StopBits = (StopBits)1;
            serialPort.ReadTimeout = 5;
            serialPort.Open();
        }


        ///
        /// 关闭端口
        ///

        public void ClosePort()
        {
            try
            {
                serialPort.Close();
                //PortState = false;
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        ///
        /// 接收数据回调用
        ///

        ///
        ///
        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();
        }
        ///
        /// 打开串口
        ///

        ///
        void Init()
        {
            try
            {
                pchSend.openPort("COM1");
                pchReceive.openPort("COM2");
               


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




        }
        ///
        /// 接收到的数据,写入文本框内
        ///

        /// 接受的数据
        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);
        }
    }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分