在 Windows XP 上,我打开了一个标准(在主板上)RS-232 串行端口并配置了
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 更改。
谢谢。