2013-04-08 50 views
1

我使用WINAPI(在C)使用以下創建的端口來讀取從COMPORT批處理:ReadFile的COM整批

hSerial= CreateFile(COM5, 
GENERIC_READ | GENERIC_WRITE, 
0, 
NULL, 
OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL |FILE_FLAG_NO_BUFFERING, 
NULL); 

,然後讀入批量數據被lengthIn長:

ReadFile(hSerial,Data,lengthIn,lengthOut,NULL) 

lengthOut表示實際讀取的數據量。

我需要確保在每次迭代中實際讀取lengthIn字節而不是更少,我該怎麼做?我如何確保lengthIn = lengthOut每次?

我認爲它與創建端口時的屬性有關(如FILE_FLAG_NO_BUFFERING),但我不確定哪一個以及如何。

+1

你可以繼續閱讀,直到你有所有的數據。當您可以接收任意數據塊時,另一種處理方式是將所有數據全部接收到緩衝區中,然後根據需要進行處理。 – Deanna 2013-04-08 12:54:33

+0

我想到了迪安娜,但認爲我必須有一些自動的方式,就像@Jonathan Potter所建議的那樣。雖然謝謝! – BioSP 2013-04-08 14:20:59

回答

2

如果您將通訊端口句柄的超時設置得足夠大,那麼ReadFile將不會返回,直到您指定的字節數已被讀取(或發生錯誤)爲止。

有關更多詳細信息,請參閱COMMTIMEOUTS結構(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363190(v=vs.85).aspx)上的文檔。

+0

完美的作品!謝謝!你知道這是否意味着這也將是延遲?這意味着如果我設置了10毫秒的超時時間並獲得3毫秒內所有需要的數據,它是否會等待其他7秒? – BioSP 2013-04-08 09:03:10

+1

不,只要指定的字節數被讀取(或延遲到期或發生其他錯誤),該調用就會返回。例如,如果您請求的字節數已經在通訊緩衝區中,則該呼叫將立即返回。 – 2013-04-08 10:32:02

+0

太棒了!謝謝!這工作 – BioSP 2013-04-08 14:21:31