2012-12-14 258 views
0

在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更改「刷新」到設備。

謝謝。

回答

0

原來我用來監視RTS線路的串口是有故障的。這是基於USB的,並且缺少短暫的轉換。

我在上面放了一個O型示波器,當我剛剛嘗試開啓/關閉RTS時,我可以看到一個1ms的信號燈。