C#串口类封装 SuperSerialPort
C#串口类封装 SuperSerialPort
基于SerialPort类做了简单的封装方便调用
代码
/// <summary>
/// SuperSerialPort
/// </summary>
public class SuperSerialPort
{
private SerialPort CommPort = new SerialPort();
public SuperSerialPort()
{
CommPort.DataReceived += serialport_DataReceived;
}
private StringBuilder SerialDataReceived = new StringBuilder();
private void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//读取数据
int length = CommPort.BytesToRead;
byte[] buffers = new byte[length];
CommPort.Read(buffers, 0, length);
//调用委托事件
DataReceived?.Invoke(buffers);
}
#region 公有属性
/// <summary>
/// 端口
/// </summary>
public string PortName
{
get { return CommPort.PortName; }
}
/// <summary>
/// 获取 端口列表
/// </summary>
public List<string> GetPortNames()
{
return SerialPort.GetPortNames().ToList<string>();
}
/// <summary>
/// 获取 奇偶校验位 列表
/// </summary>
/// <returns></returns>
public List<string> GetParitys()
{
List<string> list = new List<string>();
foreach (string str in Enum.GetNames(typeof(Parity)))
{
list.Add(str);
}
return list;
}
/// <summary>
/// 获取 停止位 列表
/// </summary>
/// <returns></returns>
public List<string> GetStopBits()
{
List<string> list = new List<string>();
foreach (string str in Enum.GetNames(typeof(StopBits)))
{
list.Add(str);
}
return list;
}
/// <summary>
/// 打开串口
/// </summary>
public void Open()
{
if (!CommPort?.IsOpen)
{
CommPort.Open();
}
}
/// <summary>
/// 关闭串口
/// </summary>
public void Close()
{
if (CommPort?.IsOpen)
{
CommPort.Close();
}
}
#endregion
#region 设置串口信息
/// <summary>
/// 设置串口信息
/// </summary>
public void SetPortInfo(string PortName, string Parity, string Stop, string Data, string BaudRate)
{
CommPort.PortName = PortName;
CommPort.Parity = (Parity)Enum.Parse(typeof(Parity), Parity);
CommPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), Stop);
CommPort.DataBits = int.Parse(Data);
CommPort.BaudRate = int.Parse(BaudRate);
}
#endregion
#region HexToByte
/// <summary>
/// HexToByte
/// </summary>
private byte[] HexToByte(string msg)
{
msg = msg.Replace(" ", "");
byte[] comBuffer = new byte[msg.Length / 2];
for (int i = 0; i < msg.Length; i += 2)
comBuffer[i / 2] = (byte)Convert.ToByte(msg.Substring(i, 2), 16);
return comBuffer;
}
#endregion
#region ByteToHex
/// <summary>
/// ByteToHex
/// </summary>
private string ByteToHex(byte[] comByte)
{
StringBuilder builder = new StringBuilder(comByte.Length * 3);
foreach (byte data in comByte)
builder.Append(Convert.ToString(data, 16).PadLeft(2, '0'));
return builder.ToString().ToUpper();
}
#endregion
#region 接收事件
/// <summary>
///
/// </summary>
public Action<byte[]> DataReceived { get; set; }
#endregion
#region 发送事件
/// <summary>
/// 发送命令
/// </summary>
/// <param name="cmd">十六进制字符串</param>
public void Send(string cmd)
{
if (!string.IsNullOrEmpty(cmd) && CommPort.IsOpen)
{
byte[] serOrder = HexToByte(cmd);
CommPort.Write(serOrder, 0, serOrder.Length);
}
}
/// <summary>
/// byte数组
/// </summary>
/// <param name="cmdbytes"></param>
public void Send(byte[] cmdbytes)
{
if (cmdbytes?.Length > 0 && CommPort.IsOpen)
{
CommPort.Write(cmdbytes, 0, cmdbytes.Length);
}
}
#endregion
}
目前只封装了这些需要的话以后再加,,,,,,,,,
C#串口类封装 SuperSerialPort的更多相关文章
- Remon Spekreijse CSerialPort串口类的修正版2014-01-10
转自:http://m.blog.csdn.net/blog/itas109/18358297# 2014-1-16阅读691 评论0 如需转载请标明出处:http://blog.csdn.net/i ...
- CSerialPort串口类最新修正版(解决关闭死锁问题)
这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...
- CSerialPort串口类最新修正版(解决关闭死锁问题)2014-01-11
这是一份优秀的类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等.Remon提供的串口类网址为:http://codeguru.earthweb.com/network/ ...
- salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...
- 谢欣伦 - OpenDev原创教程 - 串口类CxSerial
这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...
- 一个由印度人编写的VC串口类
http://www.cnblogs.com/lwngreat/p/4098374.html 软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些 ...
- mfc的一个串口类
这几天一直再看串口相关知识,对于其总结为如下串口类: 头文件声明如下: #pragma once // 声明当串口接收到线程的时候调用的函数指针 // 参数: 1,接收到的数据: 2,数据长度: 3, ...
- Redis操作Set工具类封装,Java Redis Set命令封装
Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...
- Redis操作List工具类封装,Java Redis List命令封装
Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...
随机推荐
- 简单说一下SS的原理
假设有主机A和B还有C.主机A是客户机,就是你的电脑,主机B是服务器,也就是位于日本的那台电脑.主机C是你需要访问的网站.在没有SS的情况下,数据传输的流程是:A-->C.在有SS的情况下,概括 ...
- 分布式事务(4)---RocketMQ实现分布式事务项目
RocketMQ实现分布式事务 有关RocketMQ实现分布式事务前面写了一篇博客 1.RocketMQ实现分布式事务原理 下面就这个项目做个整体简单介绍,并在文字最下方附上项目Github地址. 一 ...
- Running Code on a Thread Pool Thread_翻译
The previous lesson showed you how to define a class that manages thread pools and the tasks that ru ...
- [记录]一则HTTP配置文件参考记录
# cat ../conf/httpd.conf | grep -vE "^$|^#" ServerTokens OS ServerRoot "/etc/httpd&qu ...
- Lucene02--入门程序
Lucene02--入门程序 开发准备: Win10 IDEA JDK1.8 1.新建一个普通的maven工程 1.1 添加依赖 <dependencies> <!-- Junit单 ...
- 个人永久性免费-Excel催化剂功能第19波-Excel与Sqlserver零门槛交互-查询篇
对频繁使用Excel的高级应用的尝试用户来说,绕不过的一个问题Excel的性能问题,对于几万条数据还说得过去,上了10万行的数据量,随便一个函数公式的运算都是一个不小的负荷,有些上进一点的用户会往Ac ...
- [leetcode]914. X of a Kind in a Deck of Cards (easy)
原题 题目原意可转换为 两组有大于等于2的公因数 /** * @param {number[]} deck * @return {boolean} */ var hasGroupsSizeX = fu ...
- [leetcode] 559. Maximum Depth of N-ary Tree (easy)
原题链接 思路: 简单bfs class Solution { public: int maxDepth(Node *root) { int depth = 0; if (root == NULL) ...
- 回顾二分与bfs(或者说是递推)和简单模拟
今天,阳光正好,适合敲代码,诸事皆宜. 先来两道简单的模拟题. 第一道 机器翻译 输出为5. 代码思路:很明显需要用到队列来存单词,在建立一个bool数组来存储队列中有没有这个单词,需不需要向外界查询 ...
- 装饰器和"开放-封闭"原则
装饰器和"开放-封闭"原则 "开放-封闭"原则 软件开发中的"开放-封闭"原则,它规定已经实现的功能代码不应该被修改,但可以被扩展,即: 封 ...