当前位置:编程学习 > VB >>

VB.NET 串口访问之三

程序如下:

 

 

Imports System 

Imports System.Collections.Generic 

Imports System.ComponentModel 

Imports System.Data 

Imports System.Drawing 

Imports System.Linq 

Imports System.Text 

Imports System.IO.Ports 

Imports System.Threading 

Imports System.Text.RegularExpressions 

 

'例如:AA 44 05 01 02 03 04 05 EA 

'    这里我假设的一条数据,协议如下: 

'    数据头:     AA 44 

'    数据长度:05 

'    数据正文:01 02 03 04 05 

'    校验:       EA 

'    一般数据的校验,都会采用常用的方式,CRC16,CRC32,Xor。 

 

Public Class Form1 

 

    WithEvents Comm As SerialPort = New SerialPort 

    Private Builder As StringBuilder = New StringBuilder '避免在事件处理方法中反复的创建,所以定义到外面 

    Private ReceiveCount As Long = 0     '接收计数 

    Private SendCount As Long = 0        '发送计数 

 

    Private Listening As Boolean = False  '是否没有执行完invoke相关操作  

    Private Closingg As Boolean = False     '是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke    

 

    Private Buffer As List(Of Byte) = New List(Of Byte)(4096) '默认分配1页内存,并始终限制不允许超过    

    Private Binary_Data_1(9) As Byte      'AA 44 05 01 02 03 04 05 EA  

 

    Public Delegate Sub UpdateData(ByVal mByte() As Byte) 

 

 

    Public Sub ShowData(ByVal mByte() As Byte) 

        Console.WriteLine(mByte) 

        ReceiveCount += mByte.Length          '统计字节总数 

        Builder.Clear()                       '清除字符串构造器的内容  

        Console.WriteLine("Main1() invoke on thread{0}.", Thread.CurrentThread.ManagedThreadId) 

        If CheckBoxHex.Checked Then 

            For Each b As Byte In mByte 

                Builder.Append(b.ToString("X2") + " ") 

            Next 

        Else 

            Builder.Append(Encoding.ASCII.GetString(mByte)) 

        End If 

        TxtGet.AppendText(Builder.ToString) 

        labelGetCount.Text = "Get:" + ReceiveCount.ToString 

    End Sub 

 

    Public Delegate Sub UpdateStr(ByVal mByte As String) 

 

    Public Sub ShowStr(ByVal mByte As String) 

        TxtGet.Text = mByte 

    End Sub 

 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

 

        '初始化下拉串口名称列表框 

        Dim Ports() As String = SerialPort.GetPortNames 

        Array.Sort(Ports) 

        ComboPortName.Items.AddRange(Ports) 

        ComboPortName.SelectedIndex = IIf(ComboPortName.Items.Count > 0, 0, -1) 

        ComboBaudrate.SelectedIndex = ComboBaudrate.Items.IndexOf("9600") 

        '初始化Serialport对象 

        Comm.NewLine = vbCrLf 

        Comm.RtsEnable = True 

 

        'AddHandler Obj.Ev_Event, AddressOf EventHandler 

        'RemoveHandler Obj.Ev_Event, AddressOf EventHandler 

        'AddHandler Comm.DataReceived, AddressOf Comm_DataReceived 

        BtnXReset.PerformClick() 

 

 

    End Sub 

 

    Private Sub Comm_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm.DataReceived 

        If Closingg Then Return '如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环    

 

        Try 

            Listening = True                    '设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 

            Dim n As Long = Comm.BytesToRead    '先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致    

            Dim Buf(n - 1) As Byte              '声明一个临时数组存储当前来的串口数据  

 

            Comm.Read(Buf, 0, n)                '读取缓冲数据 

 

            Dim Data_1_Catched As Boolean = False     '缓存记录数据是否捕获到 

            Console.WriteLine("Main0() invoke on thread{0}.", Thread.CurrentThread.ManagedThreadId) 

 

 

            Buffer.AddRange(Buf) 

 

            While Buffer.Count >= 4 

                '请不要担心使用>=,因为>=已经和>,<,=一样,是独立操

补充:软件开发 , Vb ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,