一不小心看到一高手寫的C#串中操作系列的文章,很不錯(cuò),可惜我輩不懂C#,于是順便改成用VB.NET2010
順便說明,再發(fā)送16進(jìn)制不是很完善,有懂的兄弟,說明一下
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.Text.RegularExpressions
Public Class Form1
WithEvents Comm As SerialPort = New SerialPort
Private Builder As StringBuilder = New StringBuilder '避免在事件處理方法中反復(fù)的創(chuàng)建,所以定義到外面
Private ReceiveCount As Long = 0 '接收計(jì)數(shù)
Private SendCount As Long = 0 '發(fā)送計(jì)數(shù)
Private Listening As Boolean = False '是否沒有執(zhí)行完invoke相關(guān)操作
Private Closingg As Boolean = False '是否正在關(guān)閉串口,執(zhí)行Application.DoEvents,并阻止再次invoke
Public Delegate Sub UpdateData(ByVal mByte() As Byte)
Public Sub ShowData(ByVal mByte() As Byte)
Console.WriteLine(mByte)
ReceiveCount += mByte.Length
Builder.Clear()
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
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對(duì)象
Comm.NewLine = vbCrLf
Comm.RtsEnable = True
'AddHandler Obj.Ev_Event, AddressOf EventHandler
'RemoveHandler Obj.Ev_Event, AddressOf EventHandler
'AddHandler Comm.DataReceived, AddressOf Comm_DataReceived
End Sub
Private Sub Comm_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Comm.DataReceived
If Closingg Then Return '如果正在關(guān)閉,忽略操作,直接返回,盡快的完成串口監(jiān)聽線程的一次循環(huán)
Try
Listening = True '設(shè)置標(biāo)記,說明我已經(jīng)開始處理數(shù)據(jù),一會(huì)兒要使用系統(tǒng)UI的。
Dim n As Long = Comm.BytesToRead '先記錄下來,避免某種原因,人為的原因,操作幾次之間時(shí)間長,緩存不一致
Dim Buf(n - 1) As Byte '聲明一個(gè)臨時(shí)數(shù)組存儲(chǔ)當(dāng)前來的串口數(shù)據(jù)
Comm.Read(Buf, 0, n) '讀取緩沖數(shù)據(jù)
Builder.Clear() '清除字符串構(gòu)造器的內(nèi)容
Dim b As UpdateData = New UpdateData(AddressOf ShowData)
Me.BeginInvoke(b, Buf)
Catch ex As Exception
Err.Clear()
Finally
Listening = False '我用完了,ui可以關(guān)閉串口了。
End Try
End Sub
Private Sub ShowMsg(ByVal buffer() As Byte)
If CheckBoxHex.Checked Then
For Each b As Byte In Buffer
Builder.Append(b.ToString("X2") + " ")
Next
Else
Builder.Append(Encoding.ASCII.GetString(buffer))
End If
Me.TxtGet.AppendText(Builder.ToString())
labelGetCount.Text = "Get:" + ReceiveCount.ToString
End Sub
Private Sub BtnXOpen_Click(sender As System.Object, e As System.EventArgs) Handles BtnXOpen.Click
'根據(jù)當(dāng)前串口對(duì)象,來判斷操作
If Comm.IsOpen Then
Closingg = True '
While Listening
Application.DoEvents()
End While
'打開時(shí)點(diǎn)擊,則關(guān)閉串口
Comm.Close()
Closingg = False
Else
Comm.PortName = ComboPortName.Text
Comm.BaudRate = Integer.Parse(ComboBaudrate.Text)
Try
Comm.Open()
Catch ex As Exception
'捕獲到異常信息,創(chuàng)建一個(gè)新的comm對(duì)象,之前的不能用了。
Comm = New SerialPort
'現(xiàn)實(shí)異常信息給客戶。
MessageBox.Show(ex.Message)
End Try
End If
'設(shè)置按鈕的狀態(tài)
BtnXOpen.Text = IIf(Comm.IsOpen, "Close", "Open")
BtnXOpen.Enabled = Comm.IsOpen
End Sub
'動(dòng)態(tài)的修改獲取文本框是否支持自動(dòng)換行。
Private Sub CheckBoxNewLineGet_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxNewLineGet.CheckedChanged
TxtGet.WordWrap = CheckBoxNewLineGet.Checked
End Sub
Private Sub BtnXSend_Click(sender As System.Object, e As System.EventArgs) Handles BtnXSend.Click
Dim n As Integer = 0 '定義一個(gè)變量,記錄發(fā)送了幾個(gè)字節(jié)
If checkBoxHexSend.Checked Then '16進(jìn)制發(fā)送
'我們不管規(guī)則了。如果寫錯(cuò)了一些,我們允許的,只用正則得到有效的十六進(jìn)制數(shù)
Dim Mc As MatchCollection = Regex.Matches(TxtSend.Text.Trim, "(?i)[/da-f]{2}") '"(?i)[/da-f]{2}"
Dim buf As List(Of Byte) = New List(Of Byte)
'依次添加到列表中
For Each m As Match In Mc
' buf.Add(Byte.Parse(m.Value))
buf.Add(Byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber))
Next
'轉(zhuǎn)換列表為數(shù)組后發(fā)送
Comm.Write(buf.ToArray, 0, buf.Count)
n = buf.Count
Else 'ascii編碼直接發(fā)送
'包含換行符
If checkBoxNewlineSend.Checked Then
Comm.WriteLine(TxtSend.Text)
n = TxtSend.Text.Length + 2
Else
Comm.Write(TxtSend.Text)
n = TxtSend.Text.Length
End If
End If
SendCount += n '累加發(fā)送字節(jié)數(shù)
labelSendCount.Text = "Send:" + SendCount.ToString
End Sub
Private Sub BtnXReset_Click(sender As System.Object, e As System.EventArgs) Handles BtnXReset.Click
'復(fù)位接受和發(fā)送的字節(jié)數(shù)計(jì)數(shù)器并更新界面。
SendCount = 0
ReceiveCount = 0
labelGetCount.Text = "Get:0"
labelSendCount.Text = "Send:0"
Builder.Clear()
End Sub
Private Sub BtxClear_Click(sender As System.Object, e As System.EventArgs) Handles BtxClear.Click
TxtGet.Text = ""
Builder.Clear()
End Sub
End Class
摘自:wl58796351的專欄
聯(lián)系客服