在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更改。
感谢。
答案 0 :(得分:0)
原来我用来监控RTS线路的串口有问题。它是基于USB的,并且缺少短暂的过渡。
我把一个O-scope放在上面,当我刚开始尝试切换RTS开启/关闭时,我可以看到1ms的光点。