iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#串口通信工具类的封装
  • 104
分享到

C#串口通信工具类的封装

2024-04-02 19:04:59 104人浏览 独家记忆
摘要

本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下  1、SerialPortHelper串口工具类封装 using System; using S

本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下

 1、SerialPortHelper串口工具类封装

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
 
namespace public.Util
{
 
    /// <summary>
    /// 串口操作助手类
    /// </summary>
    class SerialPortHelper
    {
         /// <summary>
        /// 串口是否已打开
        /// </summary>
        public bool IsOpen { get; set; }
 
        /// <summary>
        /// 初始化 串行端口资源
        /// </summary>
        private SerialPort mySerialPort = new SerialPort();
 
        /// <summary>
        /// 串口接收数据 位置
        /// </summary>
        private static int pSerialPortRecv = 0;
 
        /// <summary>
        /// 缓存区大小的长度
        /// 缓冲区可调大
        /// (接收数据处理定时器 内接收数据量 小于下面设置的值即可)
        /// </summary>
        private static int byteLength = 40960;
 
        /// <summary>
        /// 串口接收字节 缓存区大小
        /// </summary>
        private byte[] byteSerialPortRecv = new byte[byteLength];
 
        /// <summary>
        /// 串口 接收数据处理定时器
        /// </summary>
        private Timer SerialPortRecvTimer;
 
        /// <summary>
        /// 广播 收到的数据 事件
        /// </summary>
        public event EventHandler<SerialPortRecvEventArgs> ReceivedDataEvent;
 
        /// <summary>
        /// 广播 收到的数据
        /// </summary>
        public class SerialPortRecvEventArgs : EventArgs
        {
            /// <summary>
            /// 广播 收到的串口数据
            /// </summary>
            public readonly byte[] RecvData = new byte[byteLength];
 
            /// <summary>
            /// 收到数据 的 长度
            /// </summary>
            public readonly int RecvDataLength;
 
            /// <summary>
            /// 将 收到的数据 转化成 待广播的数据
            /// </summary>
            public SerialPortRecvEventArgs(byte[] recvData, int recvDataLength)
            {
                recvData.CopyTo(RecvData, 0);
                RecvDataLength = recvDataLength;
            }
        }
 
        /// <summary>
        /// 初始化
        /// </summary>
        public SerialPortHelper()
        {
            IsOpen = false;
        }
 
        /// <summary>
        /// 设置 串口配置
        /// </summary>
        /// <param name="portName">串口号</param>
        /// <param name="baudRate">波特率</param>
        /// <param name="parity">校验位</param>
        /// <param name="dataBits">数据位</param>
        /// <param name="stopBits">停止位</param>
        private void SetSerialPortConfig(string portName, int baudRate, int parity, int dataBits, int stopBits)
        {
            // 串口 参数设置
            mySerialPort.PortName = portName;
            mySerialPort.BaudRate = baudRate;
            switch (parity)
            {
                case 0:
                default:
                    mySerialPort.Parity = Parity.None;
                    break;
 
                case 1:
                    mySerialPort.Parity = Parity.Odd;
                    break;
 
                case 2:
                    mySerialPort.Parity = Parity.Even;
                    break;
 
                case 3:
                    mySerialPort.Parity = Parity.Mark;
                    break;
 
                case 4:
                    mySerialPort.Parity = Parity.Space;
                    break;
            }
            mySerialPort.DataBits = ((4 < dataBits) && (dataBits < 9)) ? dataBits : 8;
            switch (stopBits)
            {
                case 0:
                    mySerialPort.StopBits = StopBits.None;
                    break;
 
                case 1:
                default:
                    mySerialPort.StopBits = StopBits.One;
                    break;
 
                case 2:
                    mySerialPort.StopBits = StopBits.OnePointFive;
                    break;
 
                case 3:
                    mySerialPort.StopBits = StopBits.Two;
                    break;
            }
            mySerialPort.ReadTimeout = -1;
            mySerialPort.RtsEnable = true;
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
 
            // 串口 接收数据处理定时器 参数设置
            SerialPortRecvTimer = new System.Timers.Timer();
            SerialPortRecvTimer.Interval = 100;
            SerialPortRecvTimer.AutoReset = false;
            SerialPortRecvTimer.Elapsed += new ElapsedEventHandler(SPRecvTimer_Tick);
        }
 
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="portName">串口号</param>
        /// <param name="baudRate">波特率</param>
        /// <param name="parity">校验位</param>
        /// <param name="dataBits">数据位</param>
        /// <param name="stopBits">停止位</param>
        public void OpenSerialPort(string portName, int baudRate, int parity, int dataBits, int stopBits)
        {
            try
            {
                SetSerialPortConfig(portName, baudRate, parity, dataBits, stopBits);
                mySerialPort.Open();
                IsOpen = true;
            }
            catch (System.Exception)
            {
                IsOpen = false;
                throw;
            }
        }
 
        /// <summary>
        /// 关闭串口
        /// </summary>
        public void CloseSerialPort()
        {
            try
            {
                mySerialPort.Close();
                IsOpen = false;
            }
            catch (System.Exception)
            {
                IsOpen = false;
                throw;
            }
        }
 
        /// <summary>
        /// 串口数据发送
        /// </summary>
        /// <param name="content">byte类型数据</param>
        public void SendData(byte[] content)
        {
            try
            {
                mySerialPort.Write(content, 0, content.Length);
            }
            catch (System.Exception)
            {
                throw;
            }
        }
 
        /// <summary>
        /// 串口数据发送
        /// </summary>
        /// <param name="strContent">字符串数据</param>
        /// <param name="encoding">编码规则</param>
        public void SendData(string strContent, Encoding encoding)
        {
            try
            {
                byte[] content = encoding.GetBytes(strContent);
                mySerialPort.Write(content, 0, content.Length);
            }
            catch (System.Exception)
            {
                throw;
            }
        }
 
        /// <summary>
        /// 数据处理定时器
        /// 定时检查缓冲区是否有数据,如果有数据则将数据处理并广播。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SPRecvTimer_Tick(object sender, EventArgs e)
        {
            byte[] TemporaryData = new byte[byteLength];
            int TemporaryDataLength = 0;
 
            if (ReceivedDataEvent != null)
            {
                byteSerialPortRecv.CopyTo(TemporaryData, 0);
                TemporaryDataLength = pSerialPortRecv;
 
                ReceivedDataEvent.Invoke(this, new SerialPortRecvEventArgs(TemporaryData, TemporaryDataLength));
                // 数据处理完后,将指针指向数据头,等待接收新的数据
                pSerialPortRecv = 0;
            }
        }
 
        /// <summary>
        /// 数据接收事件
        /// 串口收到数据后,关闭定时器,将收到的数据填入缓冲区,数据填入完毕后,开启定时器,等待下一次数据接收
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                SerialPortRecvTimer.Stop();
 
                byte[] ReadBuf = new byte[mySerialPort.BytesToRead];
                mySerialPort.Read(ReadBuf, 0, ReadBuf.Length);
                ReadBuf.CopyTo(byteSerialPortRecv, pSerialPortRecv);
                pSerialPortRecv += ReadBuf.Length;
 
                SerialPortRecvTimer.Start();
            }
            catch (System.Exception)
            {
                throw;
            }
        }
 
        /// <summary>
        /// 获取当前可用PortName
        /// </summary>
        /// <returns></returns>
        public static List<SerialPortParam<string>> GetPortList()
        {
            try
            {
                List<SerialPortParam<string>> lst_sParameterClass = new List<SerialPortParam<string>>();
                foreach (string data in SerialPort.GetPortNames())
                {
                    SerialPortParam<string> i_sParameterClass = new SerialPortParam<string>();
                    i_sParameterClass.Name = data;
                    i_sParameterClass.Value = data;
                    lst_sParameterClass.Add(i_sParameterClass);
                }
 
                return lst_sParameterClass;
            }
            catch (Exception)
            {
                
                throw;
            }
        }
 
        /// <summary>
        /// 设置波特率
        /// </summary>
        /// <returns></returns>
        public static List<SerialPortParam<int>> SetBaudRateValues()
        {
            try
            {
                List<SerialPortParam<int>> lst_sParameterClass = new List<SerialPortParam<int>>();
                foreach (SerialPortBaudRates rate in Enum.GetValues(typeof(SerialPortBaudRates)))
                {
                    SerialPortParam<int> i_sParameterClass = new SerialPortParam<int>();
                    i_sParameterClass.Name = ((int)rate).ToString();
                    i_sParameterClass.Value = (int)rate;
                    lst_sParameterClass.Add(i_sParameterClass);
                }
 
                return lst_sParameterClass;
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
 
 
 
    /// <summary>
    /// 设置串口助手参数类,如:波特率
    /// </summary>
    public class SerialPortParam<T> {
        /// <summary>
        /// 显示值
        /// </summary>
        string name;
 
        /// <summary>
        /// 显示值
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
 
        /// <summary>
        /// 值
        /// </summary>
        T value;
 
        /// <summary>
        /// 值
        /// </summary>
        public T Value
        {
            get { return this.value; }
            set { this.value = value; }
        }
 
    }
 
 
    /// <summary>
    /// 串口波特率列表。
    /// 75,110,150,300,600,1200,2400,4800,9600,14400,19200,28800,38400,56000,57600,
    /// 115200,128000,230400,256000
    /// </summary>
    public enum SerialPortBaudRates
    {
        BaudRate_75 = 75,
        BaudRate_110 = 110,
        BaudRate_150 = 150,
        BaudRate_300 = 300,
        BaudRate_600 = 600,
        BaudRate_1200 = 1200,
        BaudRate_2400 = 2400,
        BaudRate_4800 = 4800,
        BaudRate_9600 = 9600,
        BaudRate_14400 = 14400,
        BaudRate_19200 = 19200,
        BaudRate_28800 = 28800,
        BaudRate_38400 = 38400,
        BaudRate_56000 = 56000,
        BaudRate_57600 = 57600,
        BaudRate_115200 = 115200,
        BaudRate_128000 = 128000,
        BaudRate_230400 = 230400,
        BaudRate_256000 = 256000
    }
}

2、串工工具类的使用方法

//模拟一个点击事件 
SerialPortHelper serialPortHelper = new SerialPortHelper();
private void button1_Click(object sender, EventArgs e)
 {
           
            serialPortHelper.OpenSerialPort("COM2", 115200, 0, 8, 1);
 
            // 订阅事件 可以放在 FORM_Load 中 或者其他函数中,但必须执行
            serialPortHelper.ReceivedDataEvent += new EventHandler<SerialPortHelper.SerialPortRecvEventArgs>(serialPortHelper_ReceivedDataEvent);
 
            serialPortHelper.SendData(new byte[] { 0x0D });//send
 
 
            serialPortHelper.CloseSerialPort();//close
 
        }
 
/// <summary>
/// 接收串口数据
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void serialPortHelper_ReceivedDataEvent(object sender, SerialPortHelper.SerialPortRecvEventArgs args)
  {
            // 数据内容
            Console.Write(args.RecvData);
            // 数据长度
            Console.Write(args.RecvDataLength);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#串口通信工具类的封装

本文链接: https://www.lsjlt.com/news/139533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#串口通信工具类的封装
    本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下  1、SerialPortHelper串口工具类封装 using System; using S...
    99+
    2024-04-02
  • C#串口通信工具类的封装方法
    本篇内容介绍了“C#串口通信工具类的封装方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、SerialPortHelper串...
    99+
    2023-06-29
  • Linux串口通信工具minicom怎么安装使用
    本篇内容介绍了“Linux串口通信工具minicom怎么安装使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!minicom 是一个串口通信...
    99+
    2023-06-27
  • 微信小程序如何封装常用的API接口请求及工具类
    这篇“微信小程序如何封装常用的API接口请求及工具类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2024-04-02
  • Pandas怎么封装Excel工具类
    这篇文章主要介绍了Pandas怎么封装Excel工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pandas怎么封装Excel工具类文章都会有所收获,下面我们一起来看看吧。引言Excel是一种广泛使用的电子...
    99+
    2023-07-06
  • Java日期工具类的封装详解
    概述 在日常的开发中,我们难免会对日期格式化,对日期进行计算,对日期进行校验,为了避免重复写这些琐碎的逻辑,我这里封装了一个日期工具类,方便以后使用,直接复制代码到项目中即可使用。 ...
    99+
    2022-11-13
    Java日期工具类 Java日期类
  • HttpClient 4.0封装工具类是怎样的
    这篇文章将为大家详细讲解有关HttpClient 4.0封装工具类是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。以下为本人在实际开发过程中封装的HttpClient工具类,HttpC...
    99+
    2023-06-03
  • 怎么在Android中使用OkUSB封装一个串口通信
    这篇文章给大家介绍怎么在Android中使用OkUSB封装一个串口通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。OkUSB一个简洁的Android串口通信框架。功能简介支持设置波特率支持设置数据位支持设置停止位支持...
    99+
    2023-05-30
    android
  • javascript常用工具类如何封装
    小编给大家分享一下javascript常用工具类如何封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言因为工作中经常用到这些...
    99+
    2024-04-02
  • C#中的串口通信SerialPort详解
    今天这篇文章带大家学习下C#中的串口通讯。在日常的开发工作中,如果工作内容是CS方向的同学应该很容易接触到串口通讯方面的业务需求。那么也就很容易想到C#中SerialPort类,它就...
    99+
    2024-04-02
  • C#实现串口调试工具
    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本的也很多, 功能扩展的很开也多。所以现在...
    99+
    2024-04-02
  • 【JAVA高级】——吃透JDBC中的封装工具类、ORM和Date工具类
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:乐趣国学的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者成长之路 ...
    99+
    2023-08-31
    数据库 java mysql
  • 基于C#实现串口通信
    本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下 1.基本概念 2.前端winForm布局如下(仅仅为了实现功能,布局略丑) 3.代码实现如下 names...
    99+
    2024-04-02
  • C#如何实现串口通信
    这篇文章主要讲解了“C#如何实现串口通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现串口通信”吧!1.基本概念2.前端winForm布局如下(仅仅为了实现功能,布局略丑)3.代...
    99+
    2023-06-29
  • C#怎么实现串口通信
    本篇内容介绍了“C#怎么实现串口通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架准备出于简单考虑,首先创建一个Winform项目,本文...
    99+
    2023-07-05
  • C#实现简单串口通信
    串口通信(Serial Communications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于串行通信方式,能够实现远距离通信,长度可达...
    99+
    2024-04-02
  • Pandas封装Excel工具类的方法步骤
    目录引言1、列表转Excel文件2、多个列表转Excel文件3、读取Excel表格数据4、合并多个Excel文件到一个文件中(每个文件对应一个工作表)引言 Excel是一种广泛使用的...
    99+
    2023-05-16
    Pandas封装Excel Pandas Excel封装
  • Redis工具类封装RedisUtils的使用示例
    此RedisUtil工具类的功能: 直接使用此RedisUtil工具类的所需条件: 项目基于SpringBoot。pom.xml中需要引入依赖spring-boot-starter...
    99+
    2024-04-02
  • c++串口通信的方法是什么
    在C++中进行串口通信,通常需要使用串口通信库来实现。其中,常用的串口通信库包括Boost.Asio和Qt Serial Port等...
    99+
    2024-04-02
  • java8日期工具类封装的实战记录
    目录前言在Java 8中如何处理日期和时间再封装Java8新增的日期、时间包总结前言 java现在应该是更新到16了,想想我当年刚参加工作的时候。普遍还都是java7,那时候没有Sp...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作