2013年3月1日 星期五

SerialPort控件的操作


下段程式是自動搜尋目前可使用的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中遇到的一些問題與技巧,之中還有可以加強或改善的部份留待有時間在去處理。

沒有留言:

張貼留言