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 ,