C# 简单串口通信

串口通信最重要的参数波特率,数据位,停止位,校验位。

波特率:

串口通信时的速率

数据位:

通信中实际数据位的参数。发送一个信息包实际的位数,通常为5、7、8位。

标准的ascii码0-127(7位)。扩展的ascii码是0-255(8位)。如果使用简单的文本,就可以使用7位的数据位。

停止位:

发送数据包的最后一位。一般值为1、1.5、2位。

停止位的作用可以表示传输的结束,并且提供计算机校正时钟同步的机会。停止位越多,不同时钟同步的容错程度越大,传输的速度也比较慢。

校验位(奇偶校验位)

检测错误的方式,奇(o)、偶(e)、无(n)

串口会设置发送数据的最后一位,用一个值确保传输的数据是奇数还是偶数,这样能让接收的数据知道一个位数的状态,有机会判断传输和接收的数据不同步的问题。


来看看简单代码实现:

1.逻辑和api使用

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

namespace VSPD
{

    class PortControlHelper
    {
        //创建串口对象
        private SerialPort sp;

        /// <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();
            sp = new SerialPort();
            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
        }

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

        /// <summary>
        /// 打开窗口
        /// </summary>
        public void openPort(string name) {
            //string portName, int boudRate = 115200, int dataBit = 8, int stopBit = 1, int timeout = 5000
            sp.PortName = name;
            sp.BaudRate = 115200;
            sp.DataBits = 8;
            sp.StopBits = (StopBits)1;
            sp.ReadTimeout = 5;
            sp.Open();

        }

        /// <summary>
        /// 关闭端口
        /// </summary>
        public void ClosePort()
        {
            try
            {
                sp.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[sp.BytesToRead];
            sp.Read(buffer, 0, buffer.Length);
            string str = EncodingType.GetString(buffer);
            if (OnComReceiveDataHandler != null)
            {
                OnComReceiveDataHandler(str);
            }
        }

    }
}

2.窗口逻辑

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace VSPD
{


    public partial class Form1 : Form
    {
        //创建串口接收输入对象
        private PortControlHelper pchSend;
        private PortControlHelper pchReceive;



        public Form1()
        {
            InitializeComponent();
            pchSend = new PortControlHelper();
            pchReceive = new PortControlHelper();
            VSPDopen();
        }


        /// <summary>
        /// 打开串口
        /// </summary>
        /// 
        void VSPDopen()
        {

            //pchSend.ClosePort();
            //pchReceive.ClosePort();
            try
            {
                pchSend.openPort("COM3");
                pchReceive.openPort("COM4");

                pchReceive.OnComReceiveDataHandler += new PortControlHelper.ComReceiveDataHandler(ComReceiveData);
            }
            catch (Exception)
            {
                label1.Text = "串口通信异常";
                throw;
            }
           

        }


        /// <summary>
        /// 接收到的数据,写入文本框内
        /// </summary>
        /// <param name="data">接受的数据</param>
        private void ComReceiveData(string data)
        {
    
            this.Invoke(new EventHandler(delegate
            {
                textBox2.AppendText($"接收:{data}\n");
            }));
        }

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


    }
}

这样就实现了一个单向的串口发送信息的简单案例。


在使用的时候需要有串口,可以使用串口模拟工具,我把串口模拟工具和代码一起上传到我的github上提供下载和完善。

https://github.com/pm-WeiYu/net-- 中的 VSPD文件


猜你喜欢

转载自blog.csdn.net/qq_35240673/article/details/80999926