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 ...
随机推荐
- 将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入
//将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入 #include<stdio.h> int main() { int a[4][4],b[4][4],i,j;// ...
- 每日英语:China Overtakes U.S. in Number of Diabetes Cases
China is now home to the world's largest diabetes population. The number of people who have diabetes ...
- hdoj1114 Piggy-Bank
Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Django---ORM操作大全
前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...
- contextmenu="supermenu" 属性的应用 右键菜单打开和保存功能
<div ng-class="{'chat-dialog-news-mine':{{item.isOwn}},'chat-dialog-news-other':{{!item.isOw ...
- 歌手右侧快速入口ABCD....
1.通过v-for将右侧内容渲染出来,并绝对定位到右侧 2.给每个li绑定touchStart事件,并绑定自定义属性data-index=index: 3.点击每个li,通过e来获取所绑定的自定义属性 ...
- 带limit的hivesql排序
带limit的hivesql排序 select requestdomain,count(1) as cnt from ods_cndns_real_log where dt = 20160707 ...
- mysql 安装 注意点
选择连接数: next next 选择编码 next next 输入root默认密码 勾上 允许远程连接本机
- eclipse tomcat timeout时间设置
eclipse tomcat默认启动timeout时间太短,导致项目启动时间一长,就报错 如下设置: 工作空间\.metadata\.plugins\servers.xml文件 <?xml ve ...
- Python socket聊天室程序
http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ...