我正在編寫一個IO類,通過RS-232串行將文件上載/下載到控制器。不幸的是,我無法一次發送整個文件,我不得不將它分解成數據包並一次發送一次。這裏的基本方法...睡眠()是一個糟糕的設計,但似乎是我唯一的選擇
ifstream file ("path/to/file.ext", ios::in | ios::binary);
while(!file.eof())
{
//... zero buffer, and add packet header (8 bytes)
size_t nResult = file.read(&buffer[8], 129);
Serial.Write(buffer, nResult+8);
//... see if controller wrote anything to the serial port and process it's command
Sleep(600);
}
我知道,使用睡眠()是不是一個好的設計,但如果我刪除了睡眠()語句甚至縮短時間量的循環休眠,則控制器拋出關於緩衝區已滿的錯誤,並且傳輸失敗。 有沒有更好的方法來做到這一點?
在你說出來之前,我不能發送消息給控制器,以確定它是否準備好接受下一個數據包。它沒有這個功能。
編輯: 我忘了提,我不得不睡在哪個區間是有點「盲目」。製造商提供的協議規範沒有詳細說明數據包之間所需的任何時間長度。所以我必須通過反覆試驗來確定這個價值。我擔心它可能無法在每臺PC上運行,因此它可能無法在每個控制器上運行。
該開發工作正在爲Windows XP/Vista/7完成。
編輯#2: 此外,每個數據包的數據量實際上也是一個試錯法猜測。協議規範允許包含65,535字節的數據包(包括頭部)。但是,如果您一次發送超過129個字節,您會發現問題有時會起作用,有時不起作用。睡眠時間和可以發送的字節數量之間似乎也有關係。如果我將數據包大小降低到每個數據包20個字節,我可以將睡眠時間降低到400毫秒。我相信造成這些問題的原因是控制器將數據從緩衝區移動到文件的時間。
你總是從控制器得到答案嗎? – dwo
如果您的硬件需求包括一次發送如此多的字節,然後等待那麼多毫秒,那麼實現它的方式並不明顯。 – Gabe
是的,我甚至會認爲使用睡眠不是一個想法的壞處。我想你可以寫一個奇特的函數,包括,但考慮到你的條件,Sleep()聽起來很合理。 –
ScarletAmaranth