1

從按照第 - GPS Intermediate Driver IssuesGPS中間驅動程序從虛擬串口驅動程序減慢數據

以上未成功回答覺得我有過這一問題的新信息,去一個新的問題。

我面臨的問題是GPS中間驅動程序正在傳遞數據的速度。

我已經成功地使用Pocket Putty來讀取串行端口並查看確切的信息被暴露。

COM 1 - GPS中間驅動

COM 6 - 串行端口到PC(輸入數據手動地)

COM 8 - 虛擬串行端口,用於GPS硬件。

在閱讀COM 8時,我會看到大約每18秒出現約18個NMEA字符串,這個速度與我們可以通過有限的USB連接一樣快。它很快顯示在屏幕上。當讀取COM 6(手動發送來自PC的數據)時,其顯示速度相同。所以這些數據沒有問題。

輸入GPS中間驅動程序。 GPS中間驅動程序設置爲COM1(軟件)和COM6(硬件)時。在COM1上輸入的數據在COM1上顯示的速度與沒有GPS中間驅動程序時一樣快。數據沒有改變,所以如果我在COM6上發送「JON」,它將出現在COM1上,即使它的NMEA數據不是有效的,這很好。

問題在於COM8。 GPS中間驅動程序設置爲COM1(軟件)和COM8(硬件)時。在Pocket1上顯示的數據在COM1上真的很慢。屏幕上的輸出大約每秒5個字符,數據有效,但傳輸速度非常慢。這給我指出了在實現虛擬串行端口時的一個問題,就好像GPS中間驅動程序沒有一次只讀取一個字符的所有數據一樣,因爲我已經將問題隔離到了我的虛擬串行端口。

任何人都可以提供一個虛擬串口實現的明確例子,因爲我不知道我可以改變什麼來改善這一點,因爲COM8直接與GPS軟件和PocketPutty應用程序一起工作,這表明數據可用,正在讀取,並且是正確的。

回答

0

從運行調試版本的設備製造商獲得支持後,問題的原因是客戶端應用程序正在進行多次讀取調用。串口可以自己處理它們,但是通過GPS中間驅動程序,調用的數量太高,開銷削弱了通信,這取決於互斥鎖和一般線程問題。

客戶端應用程序需要每次讀取960個字節的數據到GPS中間驅動程序,以使它們正常工作。這不是一個理想的解決方案,所以找到了另一種修復方法

該解決方案是在read方法中添加一個WaitForSingleObject(IsThereEnoughGPSDATAEvent,COMTotalTimeout),以便所有讀取操作只在有足夠數量的可用數據時纔會獲取數據。最初我要求960在緩衝區中可用,但我已將其設置爲僅10個字節,並且仍然可用。

示例代碼

DWORD COM_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) 
{ 
    if(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE] != NULL) 
    { 
     if(WaitForSingleObject(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE], GPSTimeouts.ReadTotalTimeoutConstant) != WAIT_OBJECT_0) 
     { 
      return 0; 
     } 
    } 

    //read code goes in here 

    return dataOut; 
} 
相關問題