none
[VS2005]SerialPort Read/Write運用 RRS feed

  • 問題

  •  

    小弟我有一個SerialPort的問題

    想請問各位前輩~~

     

    For Ex:

    在使用超級終端機時

    輸入 AT    他會Return 字串 OK

     

     

    換成程式碼

    我要如何抓回OK這字串

    是要寫在SerialPort1_DataReceived這事件嗎?

     

    Code Snippet

    Private Sub btnWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteBarcode.Click
            Me.SerialPort1.Write("AT" & vbCrLf)


        End Sub

     

     

    目前我是用一個Timer去抓取傳回字串

    是不是可以不用Timer去抓取,

    如果可以, 那是用怎樣的方式抓回傳回資料會比較好呢??

     

    Code Snippet

     

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            Me.txtdata.AppendText(Me.SerialPort1.ReadExisting)
     

        End Sub

     

     

     

    2008年8月11日 上午 09:28

解答

所有回覆

  •  

    資料是會傳回字串"OK" 

    如果能不用Timer

    那是應該是用怎樣的方法 去接收回字串"OK" 呢??

     

    如果我下完     Me.SerialPort1.Write("AT" & vbCrLf)

     

     

    再去下 SerialPort1.ReadExisting 卻只會讀回空值

    Code Snippet

     

    Private Sub btnWriteBarcode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteBarcode.Click
            Me.SerialPort1.Write(Me.txtATCmd.Text & vbCrLf)

               Do
                Dim Incoming As String = SerialPort1.ReadExisting
                If Incoming Is Nothing Then
                    Exit Do
                Else
                    returnStr &= Incoming & vbCrLf
                End If

            Loop
        End Sub

     

     

     

    一定要用Timer去讀    才會讀回字串"OK"

     

    2008年8月11日 上午 10:11
  • 「是」是指應該寫在 DataReceived ,但沒說不能用在 Timer ,該如何做要看實際的用途與狀況,比如說水位計通訊每秒傳回兩筆水位,永遠一直在讀。

     

    重點在於如何確保收取到你要接收的量,這個掌握了放在哪邊都一樣。

    2008年8月11日 上午 11:22
  • 一般來說你傳資料出去後,要等待一段時間在去收回應,等待的時間長短端看你通訊的設備、資料大小、傳輸速度等決定。
    以你的程式來看,我會建議在送出資料後,加上一行:

    System.Threading.Thread.Sleep(100)

    其中參數帶的是ms,千分之一秒。

    Private Sub btnWriteBarcode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteBarcode.Click
            Me.SerialPort1.Write(Me.txtATCmd.Text & vbCrLf)


    System.Threading.Thread.Sleep(100) 'add here


               Do
                Dim Incoming As String = SerialPort1.ReadExisting
                If Incoming Is Nothing Then
                    Exit Do
                Else
                    returnStr &= Incoming & vbCrLf
                End If

            Loop

    End Sub


    2008年8月21日 上午 10:13