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))
                {
                }
            }
        }

    }
}
时间: 2024-10-26 03:52:20

C# SerialPortHelper类的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys

类图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

Python-class类的相关总结

在Python中,所有的数据类型都可以视为对象,自定义的对象数据类型就是面向对象中的类(class)的概念. 面向对象编程:object oriented programming简称OOP. 1 ###简单举例,以登记学生的姓名和成绩举例 2 #!/usr/bin/python 3 #-*- coding:utf-8 -*- 4 class Student(object): ##定义student类 5 def __init__(self, name, score): ##__init__可以绑