VB.Net 串口通信示例


    該代碼是通過 wuyazhe 的文章< C# 串口操作系列(1) -- 入門篇,一個標准的,簡陋的串口例子。>將C# 轉換成VB.net 而來。因為代碼只是語法上的改動,整體框架依幾乎並未改動,所以 代碼講解部分 就直接照搬了~供起步學習vb的朋友參考。

    這里我使用的是vs2010開發環境。

    為了使剛入門的朋友,能夠理解,對進行串口通訊時的一些必要參數進行簡單的講解:

    串口屬性主要包括

  .PortName 串口名稱,COM1, COM2等。

  .BaudRate 波特率,也就是串口通訊的速度,進行串口通訊的雙方其波特率需要相同,如果用PC連接其他非PC系統,一般地,波特率由非PC系統決定。

  .Parity 奇偶校驗。可以選取枚舉Parity中的值

  .DataBits 數據位

  .StopBits 停止位,可以選取枚舉StopBits中的值

  .Handshake 握手方式,也就是數據流控制方式,可以選取枚舉Handshake中的值

 以上參數,通過設置SerialPort 類的屬性來進行。

程序簡單界面如下:

 

代碼中已經幾乎完整的寫了注釋:

Imports System.IO.Ports
Imports System.Text.RegularExpressions
Imports System.Text

Public Class Form1

Private comm As New SerialPort()
Private builder As New StringBuilder() '避免在事件處理方法中反復的創建,定義到外面。
Private received_count As Long = 0 '接收計數
Private send_count As Long = 0 '發送計數

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 = If(comboPortName.Items.Count > 0, 0, -1)
comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600")

'初始化SerialPort對象
comm.NewLine = vbCr & vbLf
comm.RtsEnable = True '根據實際情況吧。

'添加事件注冊
AddHandler comm.DataReceived, AddressOf comm_DataReceived

End Sub

Private Sub comm_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
Dim n As Integer = comm.BytesToRead '先記錄下來,避免某種原因,人為的原因,操作幾次之間時間長,緩存不一致
Dim buf(n) As Byte '聲明一個臨時數組存儲當前來的串口數據
received_count += n '增加接收計數
comm.Read(buf, 0, n) '讀取緩沖數據
builder.Clear() '清除字符串構造器的內容

'因為要訪問ui資源,所以需要使用invoke方式同步ui。
Invoke(Sub()
'判斷是否是顯示為16禁止
If checkBoxHexView.Checked Then
'依次的拼接出16進制字符串
For Each b As Byte In buf
builder.Append(b.ToString("X2") & " ")
Next
Else
'直接按ASCII規則轉換成字符串
builder.Append(Encoding.ASCII.GetString(buf))
End If
'追加的形式添加到文本框末端,並滾動到最后。
Me.txGet.AppendText(builder.ToString())
'修改接收計數
labelGetCount.Text = "Get:" & received_count.ToString()
End Sub)
End Sub

Private Sub buttonOpenClose_Click(sender As Object, e As EventArgs) Handles buttonOpenClose.Click
'根據當前串口對象,來判斷操作
If comm.IsOpen Then
'打開時點擊,則關閉串口
comm.Close()
Else
'關閉時點擊,則設置好端口,波特率后打開
comm.PortName = comboPortName.Text
comm.BaudRate = Integer.Parse(comboBaudrate.Text)
Try
comm.Open()
Catch ex As Exception
'捕獲到異常信息,創建一個新的comm對象,之前的不能用了。
comm = New SerialPort()
'現實異常信息給客戶。
MessageBox.Show(ex.Message)
End Try
End If
'設置按鈕的狀態
buttonOpenClose.Text = If(comm.IsOpen, "Close", "Open")
buttonSend.Enabled = comm.IsOpen
End Sub

'動態的修改獲取文本框是否支持自動換行。
Private Sub checkBoxNewlineGet_CheckedChanged(sender As Object, e As EventArgs)
txGet.WordWrap = checkBoxNewlineGet.Checked
End Sub

Private Sub buttonSend_Click(sender As Object, e As EventArgs) Handles buttonSend.Click
'定義一個變量,記錄發送了幾個字節
Dim n As Integer = 0
'16進制發送
If checkBoxHexSend.Checked Then
'我們不管規則了。如果寫錯了一些,我們允許的,只用正則得到有效的十六進制數
Dim mc As MatchCollection = Regex.Matches(txSend.Text, "(?i)[\da-f]{2}")
Dim buf As New List(Of Byte)() '填充到這個臨時列表中
'依次添加到列表中
For Each m As Match In mc
buf.Add(Byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber))
Next
'轉換列表為數組后發送
comm.Write(buf.ToArray(), 0, buf.Count)
n = buf.Count '記錄發送的字節數
Else
'ascii編碼直接發送
'包含換行符
If checkBoxNewlineSend.Checked Then
comm.WriteLine(txSend.Text)
n = txSend.Text.Length + 2
Else
'不包含換行符
comm.Write(txSend.Text)
n = txSend.Text.Length
End If
End If
send_count += n '累加發送字節數
labelSendCount.Text = "Send:" & send_count.ToString() '更新界面

End Sub

Private Sub buttonReset_Click(sender As Object, e As EventArgs) Handles buttonReset.Click
'復位接受和發送的字節數計數器並更新界面。
send_count = 0
received_count = 0
labelGetCount.Text = "Get:0"
labelSendCount.Text = "Send:0"
End Sub
End Class

 

以上。 該實例源碼工程下載地址:(VS2010)

http://download.csdn.net/detail/zhuguanhao/4115837

 

本人博客園:http://www.cnblogs.com/zhuguanhao/

原文C#講解的很詳細,附上地址:http://blog.csdn.net/wuyazhe/article/details/5598945


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM