C# 串口驱动封装成类库
- 由于最近写了许多软件都需要调用到串口驱动,本来 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# 串口驱动封装成类库相关推荐
- LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)
一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧.最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要 ...
- imx6ull项目也是封装成脚本安装 Poky 交叉编译工具链类似ATK-STM32MP157交叉编译
[正点原子MP157连载]第六章 ATK-STM32MP157交叉编译篇 学习 2021-05-29 10:20887阅读 · 25喜欢 · 3评论 粉丝:17.3万文章:122 关注 正点原子提供了 ...
- Windows CE串口驱动简析(2)-PDD层实现:CReg2410Uart和TX部分(基于WinCE5.0 SMDK2410 BSP的Serial驱动)
二.PDD层 1.PDD架构 现在我们就来看看SMDK2410中串口驱动的PDD部分. MDD层和PDD COMMON层都是由微软提供的,一般情况下我们基本无须改动.微软为开发者提供了一个CSeria ...
- 从串口驱动到Linux驱动模型,想转Linux的必会!
关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到 ...
- 嵌入式驱动解析:从串口驱动到Linux驱动模型
本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到最底层的硬件操作. 对Linux中的tty子系统进行简要的说明.从理论 ...
- 从串口驱动到Linux驱动模型
大学的时候,帮朋友写的操作系统调研的作业,最近整理过去的文档时候偶然发现,遂作为博客发出来. 从串口驱动到Linux的tty子系统驱动模型简要分析 基于ARM920T核心 Samsung的S3C244 ...
- linux串口驱动分析
linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...
- linux串口驱动分析【转】
转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...
- linux 串口驱动(二)初始化 【转】
转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...
- S5PV210开发 -- 串口驱动开发
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78579074 上篇文章讲的 UART,更多的是硬件相关的知识.接下来进入正题 ...
最新文章
- [JAVA]寻找满足和的最短子序列(Minimum Size Subarray Sum)
- jsonpath的用法
- 最暖的10个小故事,看完心都融化了
- 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
- 算法面试题(数据结构)
- 如何有效解决企业敏感文件泄露问题
- Android、IOS JavascriptBridge 兼容方案
- imx6ull ccm时钟体系
- shapley和树的shap
- 计算机是如何计算 log 函数的?
- 关于Exception出现application exception overridden by commit exception
- 天猫运营和淘宝运营有哪些区别 天猫淘宝运营差异性
- oracle18c静默安装教程,Oracle 18c 19c 安装的 DBT-50000 错误解决
- 手把手教你用SetWindowsHookEx做一个键盘记录器
- Python之pandas库(万年一更版)
- r语言remarkdown展示图_为什么Markdown R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术...
- 百度ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling
- win10系统计算器闪退怎么办? win10系统计算器闪退解决方法?
- 论文阅读笔记-GT U-Net: A U-Net Like Group TransformerNetwork for Tooth Root Segmentation
- JavaScript 淘宝购物件数的选择
热门文章
- 服务器共享文档只读不可复制,局域网共享文件只读不能复制的设置方法
- ADC芯片CS1242用在电子秤单片机上面
- 开心消消乐html5游戏在线玩,开心消消乐在线玩
- 大智慧有Linux炒股软件,UOS(Deepin Linux)安装炒股软件(通达信大智慧等)的方法...
- 鸿蒙曰意心养翻译,文言文情话及翻译
- MQTT 测试工具介绍
- 怎么把pdf拆分成一页一页的?
- 孙玄:转转如何打造AI工程架构体系
- sdio stm32理解 205 sdio调试 stm32f205
- java se11.0.1安装_jdk11下载安装及环境变量配置