C#串口操作类,包涵串口读写操作

作者:操作系统

如题比方计算机有4个串口1个从未收到多少COM十三个曾经张开,无法操作COM20个不停的收纳到A5最初的多寡COM叁十五个不停的收受到AA初阶的数据COM41、点击扫描开关后,怎样分辨出发送A5数额开始的串口号,并张开,通过awaitasync的主意达成2、串口接受数据是Serail_ReceiveHandler(objectsender,SerialDataReceived伊芙ntArgsargs卡塔尔(قطر‎事件的方式落成多少接纳,怎么样做到选拔事件和异步task的协作

  这段时光做了一个和硬件装置通讯的小项目,涉及到扫描头、输送线、称重型机器、贴标机等硬件。和各道具之间通讯使用的是串口或互连网的不二等秘书诀。扫描头和贴标机使用的网络通讯,输送线和称重型机器使用的是串口通信。

串口举行操作的类,此中囊括写和读操作,类可安装串口参数、设置接纳函数、张开串口财富、关闭串口能源,操作实现后,必须要关张串口、采取串口数据事件、采用数据出错事件、获取当前全部串口、把字节型调换到十一进制字符串等功能。这么些串口类已经过了调治,能够应用:

  串口通讯,早先平素感觉隐私,没悟出用起来却那样轻松。当然,那样总结要归功于 .NET 对其操作的卷入。

 

  .NET 里提供了特别操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据。只必要 new 多个对象,简单计划一下有关属性,就足以应用串口收发数据了。

using System;

  SerialPort 类常用的性质有 PortName、BaudRate、DataBits、StopBits、Parity 等。PortName 是端口名称,如COM1、COM2等,暗许COM1;BaudRate 是Porter率,默认9600;DataBits 是数据位,暗中认可是 8;StopBits 是结束位,暗许是System.IO.Ports.StopBits.One、Parity 设定奇偶校验,默许是System.IO.Ports.Parity.None。

using System.Collections.Generic;

  当中端口名称设置的是您通讯使用的本土端口的名目,其余参数,平时暗中同意。具体意思?关自家毛事!和配备约定相近就能够了。

using System.Text;

  所以,平日的话,使用串口的预备操作,就这么轻便:

using System.IO.Ports;

1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort();2             com1.PortName = "COM1";  //端口名称,默认COM13             com1.BaudRate = 9600;  //波特率,默认96004             com1.DataBits = 8;  //数据位,默认85             com1.StopBits = System.IO.Ports.StopBits.One;  //停止位,默认 System.IO.Ports.StopBits.One6             com1.Parity = System.IO.Ports.Parity.None;  //奇偶校验,默认 System.IO.Ports.Parity.None

using System.Globalization;

  如若都施用的暗许参数,还足以轻易成这么:

namespace SerialClass

1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");

{

  当然,对硬件设施的操作须求在接收前后张开或关闭资源。SerialPort 类提供了 Open 和 Close 方法用来展开或半闭串口。

    public class SerialClass

  展开现在,即可向端口读写多少了。

    {

  SerialPort 类提供了 Write 和 WriteLine 多个点子向串口发送数据。Write 发送三个 byte 数组,和日常的流操作相近;WriteLine 能够直接发送叁个字符串。

        SerialPort _serialPort = null;

  SerialPort 类提供了 Read、ReadByte、ReadChar、ReadExisting、ReadLine 和 ReadTo 等办法能够从串口中读取数据。Read 能够把数量读取到三个 byte 数组;ReadByte 能够读取一个字节;ReadChar 能够读取八个字符;ReadExisting 能够读取当前可读取的兼具数据;ReadLine 能够读取一行数据;ReadTo 那一个自身没用过。

        //定义委托

  当然如果未有数据,就读取不到了。大家得以行使 BytesToRead 属性获取可读取的多寡长度,假设长度为 0,就申明串口中绝非接过到多少。即使急需监听端口数据,就能够独自开贰个线程再三读取。

        public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);

  除了使用频仍读取来监听串口数据,还足以接受 塞里alPort 类提供的 DataReceived 事件来监听串口中选用到的数目,当串口中有可读取的数码,系统会活动触发 DataReceived 事件处理程序。设置代码如下:

        //定义接受数据事件

1             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");2             com1.DataReceived  = new System.IO.Ports.SerialDataReceivedEventHandler(Com1_DataReceived);

        public event SerialPortDataReceiveEventArgs DataReceived;

  回调方法申明如下:

        //定义采纳错误事件

1         private void Com1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)2         {3             4         }

        //public event SerialErrorReceivedEventHandler Error;

  理论说完了,上面写一个简易的 德姆o 实验一下。

        //接受事件是还是不是有效 false表示有效

  因为要注解收发数据,需求采纳二个串口设想化的软件。该软件能够在 PC 上成对的假造串口,能够实现对 COM1 发的数额,COM2 中接到到。

        public bool ReceiveEventFlag = false;

  碰着搭建好未来,编写代码试着在单击开关的时候,将文本框的剧情写入 COM1,然后从 COM2 中读取,并动用对话框弹出来。

        #region 获取串口名

  新建二个窗体,拖入多个文本框 textbox1 和贰个按键button1,然后加上操作代码,如下:

        private string protName;

 1     public partial class Form1 : Form 2     { 3         System.IO.Ports.SerialPort COM2 = null; 4  5         public Form1() 6         { 7             InitializeComponent(); 8         } 9 10         private void Form1_Load(object sender, EventArgs e)11         {12             COM2 = new System.IO.Ports.SerialPort("COM2");13             COM2.DataReceived  = new System.IO.Ports.SerialDataReceivedEventHandler(Com2_DataReceived);14             COM2.Open();15         }16 17         private void Form1_FormClosing(object sender, FormClosingEventArgs e)18         {19             COM2.Close();20             COM2 = null;21         }22 23         private void button1_Click(object sender, EventArgs e)24         {25             System.IO.Ports.SerialPort com1 = new System.IO.Ports.SerialPort("COM1");26             com1.Open();27             com1.WriteLine(this.textBox1.Text);28             com1.Close();29         }30 31         private void Com2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)32         {33             System.IO.Ports.SerialPort com = (System.IO.Ports.SerialPort)sender;34             MessageBox.Show(com.ReadExisting;35         }36     }

        public string PortName

  运行,测试,如图:

        {

操作系统 1      

            get { return _serialPort.PortName; }

            set

            {

                _serialPort.PortName = value;

                protName = value;

            }

        }

        #endregion

        #region 获取比特率

        private int baudRate;

        public int BaudRate

        {

            get { return _serialPort.BaudRate; }

            set

            {

                _serialPort.BaudRate = value;

                baudRate = value;

            }

        }

        #endregion

        #region 默许构造函数

        /// <summary>

        /// 暗许构造函数,操作COM1,速度为9600,未有奇偶校验,8位字节,结束位为1 "COM1", 9600, Parity.None, 8, StopBits.One

        /// </summary>

        public SerialClass()

        {

            _serialPort = new SerialPort();

        }

        #endregion

        #region 布局函数

        /// <summary>

        /// 布局函数,

        /// </summary>

        /// <param name="comPortName"></param>

        public SerialClass(string comPortName)

        {

            _serialPort = new SerialPort(comPortName);

            _serialPort.BaudRate = 9600;

            _serialPort.Parity = Parity.Even;

            _serialPort.DataBits = 8;

            _serialPort.StopBits = StopBits.One;

            _serialPort.Handshake = Handshake.None;

            _serialPort.RtsEnable = true;

            _serialPort.ReadTimeout = 2000;

            setSerialPort();

        }

        #endregion

        #region 构造函数,可以自定义串口的伊始化参数

        /// <summary>

        /// 构造函数,能够自定义串口的开端化参数

        /// </summary>

        /// <param name="comPortName">要求操作的COM口名称</param>

        /// <param name="baudRate">COM的速度</param>

        /// <param name="parity">奇偶校验位</param>

        /// <param name="dataBits">数据长度</param>

        /// <param name="stopBits">停止位</param>

        public SerialClass(string comPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits)

        {

            _serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);

            _serialPort.奥迪Q3tsEnable = true;  //自动央浼

            _serialPort.ReadTimeout = 3000;//超时

            setSerialPort();

        }

        #endregion

        #region 析构函数

        /// <summary>

        /// 析构函数,关闭串口

        /// </summary>

        ~SerialClass()

       {

           if (_serialPort.IsOpen)

               _serialPort.Close();

       }

        #endregion

        #region 设置串口参数

        /// <summary>

        /// 设置串口参数

        /// </summary>

        /// <param name="comPortName">要求操作的COM口名称</param>

        /// <param name="baudRate">COM的速度</param>

        /// <param name="dataBits">数据长度</param>

        /// <param name="stopBits">停止位</param>

        public void setSerialPort(string comPortName, int baudRate, int dataBits, int stopBits )

        {

            if (_serialPort.IsOpen)

                _serialPort.Close();

            _serialPort.PortName = comPortName;

            _serialPort.BaudRate = baudRate;

            _serialPort.Parity = Parity.None;

            _serialPort.DataBits = dataBits;

            _serialPort.StopBits = (StopBits)stopBits;

            _serialPort.Handshake = Handshake.None;

            _serialPort.RtsEnable = false;

            _serialPort.ReadTimeout = 3000;

            _serialPort.NewLine = "/r/n";

            setSerialPort();

        }

        #endregion

        #region 设置接纳函数

        /// <summary>

        /// 设置串口财富,还需重载多个设置串口的函数

        /// </summary>

        void setSerialPort()

        {

            if (_serialPort != null)

            {

                //设置触发DataReceived事件的字节数为1

                _serialPort.ReceivedBytesThreshold = 1;

                //接收到叁个字节时,也会触发DataReceived事件

                _serialPort.DataReceived = new SerialDataReceivedEventHandler(_serialPort_DataReceived);

                //接纳数据出错,触发事件

                _serialPort.ErrorReceived = new SerialErrorReceivedEventHandler(_操作系统,serialPort_ErrorReceived);

                //打开串口

                //openPort();

            }

        }

        #endregion

本文由ca88发布,转载请注明来源

关键词: NET 亚洲 数据 事件 串口