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. 分享一个不错的squid 配置文件

    squid配置文件一例,只使用了web cache功能,用来给web加速. http_port 80 defaultsite=IPicp_port 0cache_peer ip parent 85 0 ...

  2. ISE约束文件*.ucf的写法

    之前一直相不明白,为什么从官网下载的AC97的IP不能跑起来,整个IP就像空壳一样,bit_clk输进去,没有任何信号输出来.从IP的RTL来看,即使是IP不连到CPU的BUS上,只要是综合进FPGA ...

  3. ny12 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  4. mac下framework联编需要设置的

    点击target,然后,在Build Phases里的空白处用鼠标点一下(艹 变态) 这时,点最上面菜单:Editor/Add Build Phases/Add Copy Files Build Ph ...

  5. struts2文件下载的编写步骤(文件导出)和输入流转换的方法

    strut2文件下载三部曲:一个流.两个头信息 说明: ①一个流,在Action中需要一个getInputStream()的方法来获取下载的内容,其中inputStream是默认的,他会指示Strea ...

  6. html5标签video(播放器)学习笔记(二)-基本操作

    html5标签video(播放器)学习笔记(二)-基本操作 subying 发布时间: 2014/12/01 23:59 阅读: 13008 收藏: 21 点赞: 3 评论: 0 摘要 本文介绍了ht ...

  7. MyEclipse9.0激活步骤

    MyEclipse 9.0的激活机制 1.破解公钥(确保MyEclipse没有开启,否则失败!)   解压破解包中的myeclipse9_keygen_activator.zip,复制publicKe ...

  8. 【WPF/C#】使用BackgroundWorker实现多线程/异步操作

    做WPF时需要做一个异步加载时的Loading遮罩,搜Stackoverflow看到很多方法,看到了这个插件: BusyIndicator in the extended WPF Toolkit 同时 ...

  9. Java面向对象编程:封装,继承,多态

    Java面向对象的三大特征: 封装:通过Java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需调用该黑箱提供的方法即可完成你想要的操作. 继承:通过类的继承,将统一的 ...

  10. C语言 · 9-1九宫格

    算法提高 9-1九宫格   时间限制:1.0s   内存限制:256.0MB      问题描述 九宫格.输入1-9这9个数字的一种任意排序,构成3*3二维数组.如果每行.每列以及对角线之和都相等,打 ...