串行通信(RTS)和Windows 7

时间:2011-05-26 13:11:11

标签: delphi windows-7 serial-port

我正在Windows 7下的Delphi 2010 XE RAD Studio上开发Delphi应用程序。我的应用程序不停地在串口上进行讨论。我正在使用AsyncPro for Delphi 2010.串口通信和我开发的计算机上的所有其他工作都很好,没有任何问题。但是,当我的应用程序的发行版本在另一个Windows 7系统上运行时,串行通信完全失败。我们探测了串行通信本身的答案,发现在发送所有字节后不会丢弃请求发送(RTS)线,而在我的开发计算机上,RTS线被正确删除。

即使我明确地将RTS线丢弃到低或假状态,RTS线也不会立即下降,但是在15毫秒之后。因此,我的发布版本上的串行通信失败。

我是否遗漏了有关Windows 7和串行通信问题的重要信息?

更新:我刚刚发现我的Aysncpro 5.0 for Delphi XE的错误。真奇怪。当我的Delphi XE IDE打开或运行时,我的程序正在完美地进行通信。当我的程序运行时关闭或关闭我的Delphi XE IDE时,同一程序通信不通或超时。

如果你知道为什么会发生这种情况,请加入。

任何帮助将不胜感激。

谢谢,

3 个答案:

答案 0 :(得分:5)

最近几次,我看到随机莫名其妙的垃圾,就像我尝试了一切,几个月都无法解决。

我发现了两个不同的常见原因:

  1. ASYNC Professional有一些我无法解决的奇怪故障,所以我放弃了它,然后转移到TComPort

  2. 我在USB驱动程序中发现了各种奇怪的流量控制错误。我发现FTDI芯片组的USB到串口比其他更可靠。

  3. 没有问题的Debug构建可能有两件事:

    1. 某些时序更改会导致USB设备驱动程序失败,而不会失败。

    2. 你实际上遇到某种线程问题,比如竞争条件,导致你的ASync Pro组件变得混乱,看起来像是你的端口发生的事情,但实际上它是ASYNC pro。

    3. 最简单的方法是尝试使用不同的USB转串口适配器,如果这不能解决您的问题,我会想要拔出AsyncPro,我也遇到了很多随机问题,并且编写自己的串口类,或使用TComPort。我有一些使用TThread使用com端口“读/写”类的经验,并且发现这是最可靠的方法,因为你可以调整Win32重叠IO调用的低级元素,直接满足你的需求,并确保您没有一些额外的复杂性/开销妨碍您。 (AsyncPro的复杂性和开销是错误的重要潜在来源。)

答案 1 :(得分:5)

对我来说听起来像计时器分辨率问题。尝试使用基于事件的计时器timeSetEvent()写入USB FTDI驱动程序时遇到同样的问题...当Delphi加载时,它会将计时器分辨率更改为小于20毫秒,这使我的应用程序正常工作。当IDE没有运行时,我无法在20ms +/- 5ms(我相信默认的Windows分辨率)下工作。

要解决此问题,我在线程中调用timeBeginPeriod(1)来设置最小系统范围的计时器分辨率。

我认为这会影响其他基于时间的事件的分辨率,因为当我使用timeBeginPeriod()时,我的应用中的其他(非多媒体计时器)等待事件的准确率会提高+/- 5ms。

所以,我建议的是,在AsyncPro代码的某个地方,它使用一些基于时间的事件或回调......这会受到Delphi在加载时改变计时器分辨率的影响。尝试在应用启动后的某个地方调用timeBeginPeriod(1),看看是否有变化。

哦,不要忘记在你的应用关闭时拨打timeEndPeriod(1)

N - [

答案 2 :(得分:1)

这肯定是另一台机器上的驱动程序问题吗?硬件流量控制也适用于我的W7测试盒(和Vista开发机器)。如果您的Apro已正确设置DCB,并且听起来像是因为您的“手动”测试,那么驱动程序工作......

从用户模式“手动”转换RTS 15毫秒是令人遗憾的,但在Windows上并不常见 - 这就是驱动程序应该这样做的原因。

RGDS, 马丁