启用RTS_CONTROL_TOGGLE时,手动快速切换RTS

时间:2012-12-14 23:19:09

标签: windows winapi serial-port

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

我把一个O-scope放在上面,当我刚开始尝试切换RTS开启/关闭时,我可以看到1ms的光点。