none
利用VB寫一個能接收RS232所傳回資料的問題 RRS feed

  • 問題

  • 利用VB寫一個能接收RS232所傳回的資料,下列是目前的程式碼,請問是否還缺了甚麼,為何執行時都沒反應?本身還是新手有許多地方都不太了解

    Imports system.IO.ports
    Imports system.text
    Public Class Form1


        '=========RS232 接收用的功能===========
        Dim WithEvents RS232 As SerialPort '宣告rs232全域變數
        Dim txtTrigger As Object

        Delegate Sub SetTextCallback(ByVal Inputstring As String)
        '=========接收字元的POOL===============
        Dim bufferStr As String



        '======================================
        Private Sub RS232_DataReceived(ByVal sender As Object, _
                           ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived

            If e.EventType <> SerialData.Chars Then Exit Sub

            Dim inDataStr As String = RS232.ReadExisting
            bufferStr += inDataStr    '==============等換行符號===
            If inDataStr.Contains(Chr(10)) Then
                Dim a() As String = bufferStr.Split(Chr(10))
                DisplayText(a(inDataStr).Trim)
            End If



        End Sub

        Private Sub DisplayText(ByVal comData As String)
            Try

                If Me.txtTrigger.InvokeRequired Then
                    Dim d As New SetTextCallback(AddressOf ShowString)
                    Me.Invoke(d, comData)
                Else '相同的執行緒
                    ShowString(comData)
                End If
            Catch ex As Exception
                Call errorLog(ex.Message & " - " & comData & " - 執行緒")
                MsgBox("執行緒錯誤!!")
            End Try

        End Sub

        Private Sub ShowString(ByVal comData As String)

            '這裡是回傳回來的字串
            MessageBox.Show(comData) '12345

        End Sub

        Private Sub openPort(ByVal portName As String)
            '=========開啟COM PORT=============
            Dim mBaudRate As Integer = 9600 '每秒傳輸位元,通訊速度
            Dim mDataBit As Integer = 8 '資料位元,資料位元設定值
            Dim mParity As Parity = Parity.None '同位檢查,同位位元檢查設定
            Dim mStopBit As StopBits = StopBits.One '停止位元

            RS232 = New IO.Ports.SerialPort(portName, mBaudRate, mParity, mDataBit, mStopBit) '建立通訊埠物件,實體化rs232
            RS232.Encoding = Encoding.ASCII

            If Not RS232.IsOpen Then
                RS232.Open()

            Else
                MsgBox("~~通訊埠開啟錯誤(通訊埠已被開啟)~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
                Call errorLog("通訊埠開啟錯誤(通訊埠已被開啟) - Sub openPort")

            End If


        End Sub



        '==========關閉RS232======
        Private Sub CloseRS232()

            Try

                If RS232 Is Nothing OrElse Not RS232.IsOpen Then
                    MsgBox("通訊埠尚未開啟", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
                    Call errorLog("通訊埠尚未開啟 - Sub CloseRS232")
                Else

                    RS232.DiscardInBuffer()
                    RS232.Close()
                    RS232 = Nothing

                End If
            Catch ex As Exception

            End Try
        End Sub

        Private Sub errorLog(p1 As String)
            Throw New NotImplementedException
        End Sub

    End Class

    • 已編輯 AChangeModerator 2013年8月2日 上午 01:18 標題當內文使用, 修改適當標題及內文, 原標題: 利用VB寫一個能接收RS232所傳回的資料,下列是目前的程式碼,請問是否還缺了甚麼,為何執行時都沒反應?本身還是新手有許多地方都不太了解
    2013年7月31日 上午 04:42

解答

  • (1) 如果沒反應, 你得先確認有沒有觸發 DataReceived 事件, 如果有觸發, 是不是符合你所設的條件. 你可以用中斷點去判斷, 或是乾脆寫的 MessageBox 在裡面確認

    (2) 寫通訊我們一般都會弄個監控程式看看是不是真的有正確傳輸, 可以參考璉大的  [推薦]通訊必備監聽軟體 AccessPort 

    (3) 如果你是初入門寫序列埠, 弄本書來看看把基本的道理弄通可能會順一點

    (4) 另外你也可以參考  海角點部落 Serial Port 系列

    (5) 不必忙著寫程式, 先把觀念弄清楚再下手寫.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年7月31日 上午 04:51
    版主

所有回覆

  • (1) 如果沒反應, 你得先確認有沒有觸發 DataReceived 事件, 如果有觸發, 是不是符合你所設的條件. 你可以用中斷點去判斷, 或是乾脆寫的 MessageBox 在裡面確認

    (2) 寫通訊我們一般都會弄個監控程式看看是不是真的有正確傳輸, 可以參考璉大的  [推薦]通訊必備監聽軟體 AccessPort 

    (3) 如果你是初入門寫序列埠, 弄本書來看看把基本的道理弄通可能會順一點

    (4) 另外你也可以參考  海角點部落 Serial Port 系列

    (5) 不必忙著寫程式, 先把觀念弄清楚再下手寫.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年7月31日 上午 04:51
    版主
  • 你的設備是開著就會一直有字串進來嗎?

    另外,一般來說 232 傳送的是 ANSI 字串,.Net 內建使用的是 Unicode ,所以請先用 Byte() 收資料,再透過 Encoding.DefaultEncoding.GetString(Byte()) 來轉成字串


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2013年8月1日 下午 01:07
  • 請問樓主, 你這個問題還有後續嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年8月10日 上午 02:38
    版主
  • 您好

    再參考您提供的第4點 海角點部落 Serial Port 系列 後 我的問題已解決

    非常感謝。

    2013年8月13日 上午 04:58