1

在 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 更改。

谢谢。

4

1 回答 1

0

原来我用来监控 RTS 线路的串口有问题。它是基于 USB 的,并且缺少短暂的转换。

我在上面放了一个 O 型示波器,当我最初尝试打开/关闭 RTS 时,我可以看到 1ms 的闪烁。

于 2012-12-19T16:39:09.117 回答