下段程式是自動搜尋目前可使用的COM Port
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'自動搜尋可用SerialPort
For Each serialPortName As String In System.IO.Ports.SerialPort.GetPortNames()
ComboBox1.Items.Add(serialPortName)
Next
ComboBox1.SelectedIndex = 0
ComboBox2.SelectedIndex = 7
End Sub
再來是利用一個Button控件來開啟與關閉SerialPort,這段程式裏有一個需要注意的地方,就是如果SerialPort1中的DtrEnable沒有設定成true則,會使得Arduino端不會重新開始,Dtr的設置是告知Arduino端是否可以開始發送資料,所以若是沒設置,推論會使得PC端在開啟或關閉SerialPort時不會送出DTR信號告知Arduino是否要重新開始發送。
Dim comPort As Boolean = False
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If comPort Then
Button1.Text = "connect"
SerialPort1.DiscardInBuffer()
SerialPort1.Close()
comPort = SerialPort1.IsOpen
' serialPort.Dispose()
Else
' serialPort = New SerialPort
Button1.Text = "disconnect"
SerialPort1.PortName = ComboBox1.Text
SerialPort1.BaudRate = Val(ComboBox2.Text)
SerialPort1.DataBits = 8 '数据位
SerialPort1.StopBits = IO.Ports.StopBits.One '停止位
SerialPort1.Parity = IO.Ports.Parity.None '校验位
' AddHandler serialPort.DataReceived, AddressOf SerialPort_DataReceived
SerialPort1.Open()
comPort = SerialPort1.IsOpen
' MessageBox.Show(SerialPort1.BaudRate.ToString + " " + SerialPort1.PortName)
End If
End Sub
最後因為SerialPort的DataReceived事件是次執行緒,無法直接更新屬於控件(畫面更新)的主執行緒,所以必須利用委派的方式將資料傳送到主執行緒中更新畫面。
Dim readBuffer As String
Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.IsOpen Then
Try
readBuffer = SerialPort1.ReadLine()
'data to UI thread
Me.Invoke(New EventHandler(AddressOf DoUpdate))
Catch ex As Exception
MsgBox("read " & ex.Message)
End Try
End If
End Sub
Public Sub DoUpdate(ByVal sender As Object, ByVal e As System.EventArgs)
ListBox1.Items.Add(readBuffer)
ListBox1.SelectedIndex = ListBox1.Items.Count - 1
End Sub
以上是在操作SerialPort中遇到的一些問題與技巧,之中還有可以加強或改善的部份留待有時間在去處理。