using System;
using System.IO.Ports; class SerialPortHelper
{
private long _receiveByteCount = 0, _sendByteOfCount = 0; public long ReceiveByteCount { get { return _receiveByteCount; } set { _receiveByteCount = value; } }
public long SendByteOfCount { get { return _sendByteOfCount; } set { _sendByteOfCount = value; } } SerialPort _serialPort = new SerialPort(); private DataReceived _received = null; public delegate void DataReceived(byte[] data); public bool IsOpen { get { return _serialPort.IsOpen; } } public static string[] SerialPortNames
{
get
{
string[] serialports = SerialPort.GetPortNames();
Array.Sort(serialports, new Comparison<string>(
delegate(string x, string y)
{
if (x.Length > 3 && y.Length > 3)
{
string index1 = x.Substring(3);
string index2 = y.Substring(3);
try
{
int n1 = Convert.ToInt32(index1);
int n2 = Convert.ToInt32(index2);
return n1 - n2;
}
catch
{
}
}
return 0;
}));
return serialports;
}
} public SerialPortHelper(DataReceived received)
{
_received = received;
_serialPort.NewLine = "\r\n";
_serialPort.DataReceived += delegate
{
System.Threading.Thread.Sleep(50);
int ReadLength = _serialPort.BytesToRead;
if (ReadLength > 0)
{
_receiveByteCount += ReadLength;
byte[] ReadBuffer = new byte[ReadLength];
_serialPort.Read(ReadBuffer, 0, ReadLength);
if(_received!=null)
{
_received(ReadBuffer);
}
}
};
} public void Open(string PortName)
{
_serialPort.PortName = PortName;
_serialPort.StopBits = StopBits.One;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.BaudRate = 19200;
_serialPort.Open();
} public void Close()
{
_serialPort.Close();
} public void WriteLine(string text)
{
if (_serialPort.IsOpen)
{
_sendByteOfCount += text.Length;
_serialPort.WriteLine(text);
}
} public void Write(byte[] buffer)
{
if (_serialPort.IsOpen)
{
_serialPort.Write(buffer, 0, buffer.Length);
_sendByteOfCount += buffer.Length;
}
}
}

调用:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace SerialnumPort1
{
public partial class Form1 : Form
{
string _tempfile = AppDomain.CurrentDomain.BaseDirectory + "temp.data";
SerialPortHelper _helper = null;
public Form1()
{
InitializeComponent();
_helper = new SerialPortHelper(delegate(byte[] data)
{
this.Invoke(
(EventHandler)delegate
{
if (checkBox2.Checked)
{
using (System.IO.FileStream fs = new System.IO.FileStream(_tempfile, System.IO.FileMode.Append))
{
fs.Write(data, 0, data.Length);
}
} StringBuilder readStr = new StringBuilder();
foreach (byte b in data)
{
string temp = string.Format("{0:X2} ", b);
readStr.Append(temp);
}
readStr.Append("已接收\r\n"); toolStripStatusLabel1.Text = "已接收字节数:" + _helper.ReceiveByteCount;
richTextBox1.AppendText(readStr.ToString());
richTextBox1.ScrollToCaret();
}
);
});
} private void Form1_Load(object sender, EventArgs e)
{
string[] serialnums = SerialPortHelper.SerialPortNames;
comboBox1.Items.AddRange(serialnums);
} private void button2_Click(object sender, EventArgs e)
{
if ("打开" == button2.Text)
{
try
{
_helper.Open(comboBox1.Text);
button2.Text = "关闭";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
}
}
else
{
button2.Text = "打开";
_helper.Close();
}
} private void button1_Click(object sender, EventArgs e)
{
if (_helper.IsOpen)
{
if (!checkBox1.Checked)
{
_helper.WriteLine(textBox1.Text);
}
else
{
string sendtext = textBox1.Text.TrimEnd(' ');
string[] sps = sendtext.Split(' ');
byte[] sendata = new byte[sps.Length];
for (int i = 0; i < sendata.Length; ++i)
{
sendata[i] = (byte)Convert.ToInt32(sps[i], 16);
}
_helper.Write(sendata);
}
richTextBox1.AppendText(textBox1.Text + " 已发送\r\n");
richTextBox1.ScrollToCaret();
toolStripStatusLabel2.Text = "已发送字节数:" + _helper.SendByteOfCount;
}
} private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked)
{
System.IO.File.Delete(_tempfile);
using (System.IO.FileStream fs = System.IO.File.Create(_tempfile))
{
}
}
} }
}

C# SerialPortHelper类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

随机推荐

  1. android.content.res.TypedArray-深入理解android自定义属性(AttributeSet,TypedArray)

    属性 自定义属性,首先要定义出来属性,我们新建一个attrs.xml: <?xml version="1.0" encoding="utf-8"?> ...

  2. cocos2d-x分别在Visual Studio和eclipse中设置启用Box2D

    cocos2d-x内嵌有chipmunk和Box2D两个物理库,默认启用的是chipmunk.如果想使用Box2D,可做如下设置.PS:本人所用的版本是cocos2d-x-2.2.5. 一.在Visu ...

  3. Oracle PLSQL Demo - 09.Open、Fetch遍历游标[Open, Fetch, Close Record CURSOR]

    declare r_emp scott.emp%rowtype; cursor cur_emp is select t.* from scott.emp t; begin open cur_emp; ...

  4. Ubuntu下安装JDK1.7

    Ubuntu操作系统下如何手动安装JDK1.7呢?本文是我经历的全过程. Ubuntu版本:12.04 LTS JDK版本:1.7.0_04 安装目录:/usr/local/development/j ...

  5. 去除img、video之间默认间隔的几种方法

    img,video{ /*第1种方式*/ border: ; vertical-align: bottom; /*第2种方式*/ outline-width:0px; vertical-align:t ...

  6. ip_conntrack table full dropping packet解决方案

    在一台繁忙的服务器上,建议关闭ip_conntrack模块的加载: 当我们开启iptables后,会有这么个现象发生,丢包.ping的话会断断续续的丢包,ifconfig 会看到网卡dropped:X ...

  7. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  8. 网络虚拟化(SDN,NFV..)和企业骨干网的演化

    本来昨天就规划了今天的这篇文章,无奈昨天中午自己喝了将近一瓶的52度二锅头...晚上想着今天怎么着也完了,要颓废难受一天了...没想到早上居然一点都不难受了.于是就写下了本文.正文之前,还是做个广告, ...

  9. kafka的分区模式?

    当别人问这个问题的时候,别人肯定是想你是否看过源码.是否针对不同场景改过kafka的分区模式 这是别人最想知道的是,你的message如何负载均衡的发送给topic的partition 我们用kafk ...

  10. 你用过Spring中哪些功能?

    核心容器: IOC:依赖注入 AOP:日志记录,性能统计,安全控制,事务处理,异常处理 Spring MVC: Spring profile:生产和日常配置的切换 Spring事件触发功能:比较简单, ...