在Windows XP中,我有一個標準(在主板上),RS-232串行端口打開並快速切換RTS時手動RTS_CONTROL_TOGGLE啓用
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
這工作得很好滿足我的需求進行配置。
現在,雖然沒有待處理的RX,但我有時需要在我的應用程序的控制下短暫地切換RTS線。我不能只調用EscapeCommFunction,因爲啓用RTS_CONTROL_TOGGLE時會失敗。
我想這一點:
dcb.fRtsControl = RTS_CONTROL_ENABLE; // manual RTS control and turns on RTS
SetCommState(hDevice, &dcb);
dcb.fRtsControl = RTS_CONTROL_TOGGLE; // turns off RTS since there is no TX pending
SetCommState(hDevice, &dcb);
然而,這似乎永遠不會工作。我從來沒有看到RTS切換。這就像設備驅動程序注意到我剛剛設置了RTS並且現在正在清除它,所以它只是放棄了我正在做的事情。
如果我擺在那裏睡眠:
dcb.fRtsControl = RTS_CONTROL_ENABLE; // turn on RTS
SetCommState(hDevice, &dcb);
Sleep(1);
dcb.fRtsControl = RTS_CONTROL_TOGGLE; // turns off RTS since there is no TX pending
SetCommState(hDevice, &dcb);
然後我看到了切換,但它的長度變化極大,從任何地方1到15毫秒(這是我想可以預料的)。我使用timeBeginPeriod來設置1ms的調度,我的線程已經是高優先級了(我應該去實時優先?)。
那麼,有什麼我可以做「沖洗」的RTS變化的硬件,所以我不必做睡眠?我可以等待(使用QueryPerformanceCounter等待我想要的時間),但我擔心這仍然不會將RTS更改「刷新」到設備。
謝謝。