2010-02-14 47 views
2

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

它可以读取和写入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字符或有没有办法将一个字节传递给Mscomm而不转换为字符?

+2

你应该添加一个'var'节以及所有使用的数据类型。 – mghie 2010-02-14 14:19:33

回答

2

人权委员会现在返回一个Unicode WideChar(预德尔福2009年,它返回一个单字节ANSIChar类型)。

的最简单的解决方案是强制转换的字节值到ansischar:

var_ansichar := AnsisChar(var_byte); 

代替使用CHR()。但请注意Mghie说什么。确保你的组件,声明变量等的键入是正确的(AnsiChar,AnsiString等)。

+0

也记住字符consts现在默认返回Unicode字符。看到这个打击http://wiert.wordpress.com/2010/01/18/delphi-highcharunicode-directive-delphi-rad-studio/和这个新闻组线程https://forums.embarcadero.com/thread.jspa? threadID = 31260获取更多背景信息。 – 2010-02-15 14:57:52

1

既然你还没有发布关于使用我不会进入你的代码可能有问题的数据类型的任何信息,但我想太多了char类型是广泛的两个字节在Delphi 2009+是最您的代码可能的原因不再正常工作。

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

+0

感谢您的帮助。我用Portmon,结果是CHR()函数对于那些大于128,所以我用ANSIChar类型(值返回一个错误值),而不是CHR()和每一件事情就OK。 – 2010-02-16 07:08:22