2010-11-16 23 views
2

有沒有辦法檢查USB設備可用的字節數(在我們的例子中是打印機)?WinApi從USB端口獲取可用字節數?

我們使用CreateFileReadFileWriteFile與我們的USB設備進行IO通信,但是如果不實際讀取數據,我們無法弄清楚有多少數據可用。我們不能用GetFileSize,因爲即使文檔說,你不能將其用於:

「nonseeking設備,如管道或通信設備」 ......

使不起作用。有什麼建議麼?我們是否錯誤地進行USB I/O?有沒有更好的方式來讀取/寫入USB?

回答

0

你可以使用C#嗎?如果是這樣,您可以使用System.IO.SerialPort類訪問USB端口,然後爲傳入數據設置一個DataReceived事件處理程序。有一個BytesToRead屬性,告訴你有多少數據正在等待被讀取。

所有這些必須在本地代碼中可用,如果我能找到它,我將編輯它。

編輯:我能找到的最好的是ReadPrinter - 我不知道如何檢查數據是否存在,如果不存在,這會阻止。

+0

我可以使用C#(實際上會更喜歡它!)但是,如何從SerialPort類訪問USB端口?你給了什麼端口名稱?我很快嘗試過,但它不會連接USB端口名稱,當我做SerialPort.GetPortNames()它只返回COM1,3,4,5,沒有USB ... – 2010-11-16 17:46:54

+0

@OTisler - 是的,我想知道如何綁定工作。仍在挖掘。 – 2010-11-16 17:54:46

+0

@OTisler - 你運氣不好,在.Net 4中'SerialPort'名稱必須以「COM」開頭 - http://connect.microsoft.com/VisualStudio/feedback/details/365891/system-io-serialport- portname-can-only-start-with-com – 2010-11-16 18:00:48

3

您首先需要以異步模式打開端口。要做到這一點,請將國旗FILE_FLAG_OVERLAPPED改爲CreateFile。然後,當您撥打ReadFile時,傳遞一個指向OVERLAPPED結構的指針。這會進行異步讀取,並立即返回ERROR_IO_PENDING而不會阻塞(或者,如果操作系統已經緩存了數據,您可能會很幸運並獲得成功讀取 - 準備好處理該情況)。

異步I/O啓動後,您可以定期檢查是否已完成GetOverlappedResult

這使您可以回答「是否有可用的X字節數據?」問題。對於特定的X值(傳遞給ReadFile的值)。 95%的時間,這很好,因爲你正在尋找特定格式的數據。另外5%的時間,您需要添加另一層抽象頂層,在這裏您繼續進行異步讀取並將數據存儲在緩衝區中。

請注意,異步I/O非常複雜,需要考慮很多邊界情況。仔細閱讀這些函數的所有文檔,以確保您的代碼是正確的。

+0

抱歉,我應該在問題中規定這是在Windows移動設備上,因此重疊的異步內容不起作用。 – 2010-11-16 18:05:41

+0

@OTisler:在這種情況下,我認爲最好的選擇可能是創建一個單獨的線程並執行同步的「ReadFile」,但我對Windows Mobile不熟悉,不知道是否有更好的選項。 – 2010-11-16 18:09:37

+0

謝謝,我們現在就是這樣做的。我只希望有另一種方式除了做一個實際的閱讀... – 2010-11-16 18:14:42