• 由于最近写了许多软件都需要调用到串口驱动,本来 C#自带的已经封装的挺好了,不过为了以后图省事,所以在C#串口驱动的基础上封装了一个类库,未来只要引用一个类库,用两行代码直接完成了串口的操作。
  • 下面讲一下串口类库里面的内容以及调用方法。
  • 串口类库调用方法:
    首先,在解决方案中,添加“现有项目”,现有项目选择类库。
    然后,在需要使用串口的项目中右键点击“引用”,选择“添加引用”,在项目中选择刚才添加的引用即可。
    最后,在代码中添加下面这一行代码,即算引用成功。
SerialPortUtility mySp = new SerialPortUtility();
  • 串口无非就4个功能:
    1. 打开串口
    打开串口前,需要配置好串口参数,如果没有配对参数的话,用try catch捕捉报错信息,就会提示你哪些参数没用配对,同理,用try catch也能捕捉到打开的串口 是否有异常等状况。
    下面是类库代码:
     /// <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();}catch (System.Exception){throw;}}

下面是调用类库方法的代码:

mySp.OpenSerialPort("COM2"/*串口号*/, 115200/*波特率*/, 0/*校验位*/, 8/*数据位*/, 1/*停止位*/);

2. 关闭串口
关闭串口之前只要判断下该串口是否打开过即可。
下面是类库代码:

     /// <summary>/// 关闭串口/// </summary>public void CloseSerialPort(){try{mySerialPort.Close();}catch (System.Exception){throw;}}

下面是调用类库方法的代码:

mySp.CloseSerialPort();

3. 发送数据
下面是类库代码:

     /// <summary>/// 串口数据发送/// </summary>/// <param name="content"></param>public void SendData(byte[] content){try{mySerialPort.Write(content, 0, content.Length);}catch (System.Exception){throw;}}

下面是调用类库方法的代码:
发送数据时,如果不是byte类型的话,需要进行一次格式转换。

mySp.SendData(new byte[] { 0x0D });

4. 接收数据
下面是类库代码:

     /// <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>/// <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;}}

下面是调用类库方法的代码:
下面相当于是订阅串口接收数据事件,这样一有消息就能接收到,打开串口操作前或后都能加,但是一定要加,不加的话,就没办法接收到消息。

// 订阅事件 可以放在 Form_Load 中 或者其他函数中,但必须执行
mySp.ReceivedDataEvent += new EventHandler<SerialPortUtility.SerialPortRecvEventArgs>(mySp_ReceivedDataEvent);/// <summary>/// 订阅接收数据的内容/// </summary>/// <param name="sender"></param>/// <param name="args"></param>private void mySp_ReceivedDataEvent(object sender, SerialPortUtility.SerialPortRecvEventArgs args){// 数据内容Console.Write(args.RecvData);// 数据长度Console.Write(args.RecvDataLength);}

本项目源码CSDN下载地址:https://download.csdn.net/download/langwangak/11229685
本项目源码Github下载地址:https://github.com/Liu-YiZe/SerialPort_4NetFramework

C# 串口驱动封装成类库相关推荐

  1. LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)

    一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧.最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要 ...

  2. imx6ull项目也是封装成脚本安装 Poky 交叉编译工具链类似ATK-STM32MP157交叉编译

    [正点原子MP157连载]第六章 ATK-STM32MP157交叉编译篇 学习 2021-05-29 10:20887阅读 · 25喜欢 · 3评论 粉丝:17.3万文章:122 关注 正点原子提供了 ...

  3. Windows CE串口驱动简析(2)-PDD层实现:CReg2410Uart和TX部分(基于WinCE5.0 SMDK2410 BSP的Serial驱动)

    二.PDD层 1.PDD架构 现在我们就来看看SMDK2410中串口驱动的PDD部分. MDD层和PDD COMMON层都是由微软提供的,一般情况下我们基本无须改动.微软为开发者提供了一个CSeria ...

  4. 从串口驱动到Linux驱动模型,想转Linux的必会!

    关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到 ...

  5. 嵌入式驱动解析:从串口驱动到Linux驱动模型

    本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到最底层的硬件操作. 对Linux中的tty子系统进行简要的说明.从理论 ...

  6. 从串口驱动到Linux驱动模型

    大学的时候,帮朋友写的操作系统调研的作业,最近整理过去的文档时候偶然发现,遂作为博客发出来. 从串口驱动到Linux的tty子系统驱动模型简要分析 基于ARM920T核心 Samsung的S3C244 ...

  7. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  8. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  9. linux 串口驱动(二)初始化 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...

  10. S5PV210开发 -- 串口驱动开发

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78579074 上篇文章讲的 UART,更多的是硬件相关的知识.接下来进入正题 ...

最新文章

  1. [JAVA]寻找满足和的最短子序列(Minimum Size Subarray Sum)
  2. jsonpath的用法
  3. 最暖的10个小故事,看完心都融化了
  4. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
  5. 算法面试题(数据结构)
  6. 如何有效解决企业敏感文件泄露问题
  7. Android、IOS JavascriptBridge 兼容方案
  8. imx6ull ccm时钟体系
  9. shapley和树的shap
  10. 计算机是如何计算 log 函数的?
  11. 关于Exception出现application exception overridden by commit exception
  12. 天猫运营和淘宝运营有哪些区别 天猫淘宝运营差异性
  13. oracle18c静默安装教程,Oracle 18c 19c 安装的 DBT-50000 错误解决
  14. 手把手教你用SetWindowsHookEx做一个键盘记录器
  15. Python之pandas库(万年一更版)
  16. r语言remarkdown展示图_为什么Markdown R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术...
  17. 百度ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling
  18. win10系统计算器闪退怎么办? win10系统计算器闪退解决方法?
  19. 论文阅读笔记-GT U-Net: A U-Net Like Group TransformerNetwork for Tooth Root Segmentation
  20. JavaScript 淘宝购物件数的选择

热门文章

  1. 服务器共享文档只读不可复制,局域网共享文件只读不能复制的设置方法
  2. ADC芯片CS1242用在电子秤单片机上面
  3. 开心消消乐html5游戏在线玩,开心消消乐在线玩
  4. 大智慧有Linux炒股软件,UOS(Deepin Linux)安装炒股软件(通达信大智慧等)的方法...
  5. 鸿蒙曰意心养翻译,文言文情话及翻译
  6. MQTT 测试工具介绍
  7. 怎么把pdf拆分成一页一页的?
  8. 孙玄:转转如何打造AI工程架构体系
  9. sdio stm32理解 205 sdio调试 stm32f205
  10. java se11.0.1安装_jdk11下载安装及环境变量配置