【问题标题】:Is the MsComm ActiveX compatible with Delphi 2010?MsComm ActiveX 是否与 Delphi 2010 兼容?
【发布时间】:2010-02-14 13:44:40
【问题描述】:

我已将我们的项目从 Delphi 7 移植到 Delphi 2010。添加了一些类型转换后,现在我的项目运行良好,所有功能都正常工作,除了绑定到 COM 端口和 MSCOMM ActiveX 组件的程序的主要功能。

它可以从 COM 端口读取和写入,但似乎有问题,因为连接到该端口的设备返回错误代码,尽管它在 Delphi7 中使用相同的代码正常工作。在代码中,您可以在向设备发送一些字节后看到下面的一个字节作为校验和发送。另一方面,如果接收到的校验和与计算的校验和相等,则设备获取字节并使用相同的公式计算校验和,设备返回“O”为正常,否则返回“E”为错误。 OutCom 被定义为 Olevariant。

OutCom := chr(ord(Fbyte));
Mscomm1.Output := OutCom;

OutCom := chr(ord(Sbyte));
Mscomm1.Output := OutCom;

OutCom := chr(ord(DigitOne));
Mscomm1.Output := OutCom;
OutCom := chr(ord(DigitTwo));
Mscomm1.Output := OutCom;
OutCom := chr(ord(DigitThree));
Mscomm1.Output := OutCom;
SumOfBits := (System_No - 1) + Fbyte + Sbyte + DigitOne + DigitTwo + DigitThree;

CheckSum := ( (SumOfBits mod 256) xor 255 ) + 1;

OutCom := chr(ord(CheckSum));
Mscomm1.Output := OutCom;

OutCom := 'E';
Mscomm1.Output := OutCom;
OutCom := 'N';
Mscomm1.Output := OutCom;

Delphi 2010 中的相同代码返回不同的结果。我猜 chr() 函数返回的结果与 Delphi7 不同。如果这是真的,那么我怎样才能获得一个字节的 Ascii char,或者有没有办法将一个字节传递给 Mscomm 而无需转换为 char?

【问题讨论】:

  • 你应该已经添加了一个var 部分,其中包含所有使用的数据类型。

标签: delphi serial-port char delphi-2010


【解决方案1】:

Chr 现在返回一个 Unicode WideChar(在 Delphi 2009 之前,它返回一个单字节 AnsiChar)。

最简单的解决方案是将字节值类型转换为 ansischar :

var_ansichar := AnsisChar(var_byte);

而不是使用 Chr()。但请注意Mghie 所说的内容。确保您的组件、声明的变量等的类型正确(AnsiChar、AnsiString 等)。

【讨论】:

【解决方案2】:

由于您仍然没有发布有关使用的数据类型的任何信息,因此我不会讨论您的代码可能存在的问题,但我也认为在 Delphi 2009+ 中 char 类型为两个字节宽是最可能的您的代码不再正常工作的原因。

但是,如果我遇到这个问题,我肯定会首先检查通过串行连接发送了哪些字节。为此,您可以使用 Portmon for Windows,这是一个 SysInternals 工具,它使用并行和串行接口驱动程序的过滤 API,因此能够显示调用的所有 API 函数以及发送和接收的所有数据字节。仅在启用您连接的 COM 端口的情况下运行此程序,并检查从 PC 发送到外部设备的数据。如果您在数据字节之间看到大量 $00 字节,则您发送的是宽字符而不是 Ansi 字符,并且更正数据类型应该可以解决问题。

【讨论】:

  • 感谢您的帮助。我使用了 Portmon,结果是 chr() 函数为大于 128 的值返回了错误的值。所以我使用 Ansichar() 而不是 chr(),一切正常。
猜你喜欢
  • 2013-10-26
  • 2012-08-23
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多