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. .net程序调试一:快速定位异常

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  2. [na]win7系统安装在t450s

    电脑配置 电脑型号 联想 ThinkPad T450s 笔记本电脑(最近买了个ngff口的128g的固态ssd) 操作系统 Windows 旗舰版 64位 主显卡 集成显卡 IE浏览器 版本号 8.0 ...

  3. Linux环境下搭建测试环境(LAMP详细说明)

    一.安装虚拟机与CentOS7 传送门:https://www.cnblogs.com/mrgavin/p/9372393.html 注意:以下安装,我都是用的root权限. 二.安装Apache1. ...

  4. .net+jquery+ashx实现客户端模拟登陆扩展

    客户端实现:login namespace LoginApp { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </su ...

  5. angular学习笔记(十)-src和href处理

    本篇主要介绍angular中图片的src和链接的href的处理: 用到了以下两个属性: ng-src: 绑定了数据的路径表达式 ng-href: 绑定了数据的路径表达式 例如: <!DOCTYP ...

  6. posix多线程--三种基本线程编程模型

    本文介绍了三种构建线程解决方案的方式. 一.流水线:每个线程执行同一种操作,并把操作结果传递给下一步骤的线程. 代码示例如下:终端输入一个int值,每个线程将该值加1,并将结果传给下一个线程. #in ...

  7. 【转】VMware虚拟机中CentOS设置固定IP

    因为需要配置固定IP,在网上找了很久终于找到一个可行的例子,自己配置成功了. 1.首先获取你的GATEWAY 方便后面在cento系统配置里使用选取菜单栏:Edit->Virtual Netwo ...

  8. FileZilla server windows 2003系统下适用的版本

    最新版的FileZilla server 在windows 2003系统下已经不能用了 http://files.cnblogs.com/files/airoot/FileZilla_Server-0 ...

  9. js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结【转】

    [摘要:之前常常正在代码中看到Math.round.parseInt.Math.floor战Math.ceil那四个函数,固然晓得效果皆能够返回一个整数,然则对他们四者的差别照样没有太清晰,本日便做一 ...

  10. Disable Maven Nature和disable workspace resolution

    1.Disable Maven Nature myeclipse更新maven的时候,手抖了一下,点上了Disable Maven Nature,然后工程右键菜单中的Maven栏就不见了! 其实这是把 ...