2010-02-14 70 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