C# SerialPortHelper类
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类的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- C# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
随机推荐
- 并行开发系列 Plinq等
http://www.cnblogs.com/huangxincheng/archive/2012/04/03/2430638.html
- android.content.res.TypedArray-深入理解android自定义属性(AttributeSet,TypedArray)
属性 自定义属性,首先要定义出来属性,我们新建一个attrs.xml: <?xml version="1.0" encoding="utf-8"?> ...
- angular学习笔记(七)-迭代2
视图的迭代和它的ng-repeat属性绑定的数据是实时绑定的,一旦数据发生了改变,视图也会立即更新迭代. 还是刚才的那个例子,给它添加一个添加数据按钮和一个删除数据按钮. <!DOCTYPE h ...
- ny236 心急的C小加 hdoj1051 Wooden Sticks
心急的C小加 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间 ...
- Qt入门-layout布局
开发一个图形界面应用程序,界面的布局影响到界面的美观.在设计一个界面之前,应该考虑到开发的界面可能给不用的用户使用,而用户的屏幕大小.纵横比例.分辨率可能不同,界面还可能是可缩放的,程序应该可以适应这 ...
- css3实现3d显示效果
<!doctype html><html><head> <meta charset="UTF-8"> <meta ...
- 刷新页面要通过F5
而不是选中地址栏再按enter键,这样可能产生两种问题: 1.地址栏中的URL可能包括你上次提交的参数,你按了enter之后可能导致上次提交的参数重复提交 2.可能导致根本就没有刷新页面,刚才我修改了 ...
- RTX——第7章 任务管理
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 单任务系统学习多任务系统之前,我们先来回顾下单任务系统的编程框架,即裸机时的编程框架. 裸机编程主要是采 ...
- dubbox2.8.4例子教程一
简介 Dubbo是一个来自阿里巴巴的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用.Kryo/FST序列化等等.并将其命名为Dubbox(即Dubbo ...
- 如何设置Windows server 2008 R2登陆密码?
我第一次用该系统,登陆系统需要设置新密码,科沃怎么设置新密码都是新密码不符合条件,不允许我创建,该怎么办? 答案: 至少6个字符,要包括大小写.符号.数字这四组字符中的三组.如12abAB是有效密码, ...