none
取得 GPS 訊號時發生 作業逾時 RRS feed

  • 問題

  • 各位先進好

    我寫了一個簡單的程式來抓 HTC 的 GPS 訊號
    如下所示

    Imports System.IO
    Imports System.IO.Ports
    
    Public Class Form1
    
      Dim WithEvents GPSSerial As New SerialPort
      Public Delegate Sub myDelegate(ByVal strMeaasge As String)
    
      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        GPSSerial.PortName = "COM4"
        GPSSerial.BaudRate = 4800
        GPSSerial.DataBits = 8
        GPSSerial.Parity = Parity.None
        GPSSerial.StopBits = StopBits.One
    
    	If GPSSerial.IsOpen Then
          GPSSerial.Close()
        Else
          GPSSerial.Open()
        End If
      End Sub
    
    
      Sub UpdateTextBox(ByVal strMeaasge As String)
        
      End Sub
    
      Private Sub GPSSerial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles GPSSerial.DataReceived
        Dim strMeaasge As String
        Try
          strMeaasge = GPSSerial.ReadExisting
          Me.Invoke(New myDelegate(AddressOf UpdateTextBox), strMeaasge)
        Catch ex As Exception
          ' 收到「作業逾時」錯誤訊息
        End Try    
      End Sub
      
    End Class
    

    程式是可以收到 GPS 訊號
    但是每次在 DataReceived 事件中收到 GPS 訊號後
    會馬上再收到 「作業逾時」的錯誤訊息

    大概 1 秒後,又會在收到 GPS 訊號
    然後又再收到 「作業逾時」的錯誤訊息

    如此一直循環

    雖然我可以用 try Catch 來不讓使用者感覺有問題
    但是總覺得這樣的處理方式不好

    不知是否我的程式哪邊沒有寫好、哪個屬性沒有設定到
    請先進們指導

    謝謝

    2010年5月2日 下午 01:09

解答

  • 從線上手冊來看,你用錯方法了。

    我自己是用 SerialPort.Read。

     

    你用的方法從線上手冊來看,應該是屬於 PeekData 的一種方法,你應該要用 Read 把資料讀掉,否則資料會卡在緩衝區:

    ms-help://MS.MSDNQTR.v90.cht/fxref_system.io.ports/html/bcf772dc-b00c-607f-b597-0241a447c981.htm

    例外狀況

    例外狀況 條件
    InvalidOperationException

    指定的連接埠未開啟。

    備註

    這個方法會將 SerialPort 物件的資料流和內部緩衝區的內容做為字串傳回。這個方法不使用逾時。請注意,這個方法可以將結尾前導位元組 (Lead Byte) 保留在內部緩衝區中,使 BytesToRead 值大於零。

    如果必須在從資料流讀取文字和讀取二進位資料之間切換,請選取通訊協定,精確定義文字和二進位資料之間的界限,例如手動讀取位元組和解碼資料。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月2日 下午 05:34

所有回覆

  • 您好

    錯誤出現再這一行:strMeaasge = GPSSerial.ReadExisting

    我把委派的程式拿掉,一樣會出現逾時的錯誤

     

    我在 DataReceived 事件中加入了  System.Threading.Thread.Sleep(1000)

    Private Sub GPSSerial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles GPSSerial.DataReceived
      System.Threading.Thread.Sleep(1000)
      Dim strMeaasge As String
      Try
       strMeaasge = GPSSerial.ReadExisting
       Me.Invoke(New myDelegate(AddressOf UpdateTextBox), strMeaasge)
      Catch ex As Exception
       ' 收到「作業逾時」錯誤訊息
      End Try  
    End Sub
    

    就不會再出現作業逾時了
    但是 變成會收到 兩筆 GPS 的座標資料

    請問先進們在讀 GPS 資料時,都有讓程式 Sleep 嗎?

    2010年5月2日 下午 05:23
  • 從線上手冊來看,你用錯方法了。

    我自己是用 SerialPort.Read。

     

    你用的方法從線上手冊來看,應該是屬於 PeekData 的一種方法,你應該要用 Read 把資料讀掉,否則資料會卡在緩衝區:

    ms-help://MS.MSDNQTR.v90.cht/fxref_system.io.ports/html/bcf772dc-b00c-607f-b597-0241a447c981.htm

    例外狀況

    例外狀況 條件
    InvalidOperationException

    指定的連接埠未開啟。

    備註

    這個方法會將 SerialPort 物件的資料流和內部緩衝區的內容做為字串傳回。這個方法不使用逾時。請注意,這個方法可以將結尾前導位元組 (Lead Byte) 保留在內部緩衝區中,使 BytesToRead 值大於零。

    如果必須在從資料流讀取文字和讀取二進位資料之間切換,請選取通訊協定,精確定義文字和二進位資料之間的界限,例如手動讀取位元組和解碼資料。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月2日 下午 05:34
  • 我想是因為你資料還沒全部收完,就進入GPSSerial_DataReceived這裡了

    可以調整ReceivedBytesThreshold試試

     

    2010年5月5日 上午 02:52