Совместим ли MsComm ActiveX с Delphi 2010? - PullRequest
2 голосов
/ 14 февраля 2010

Я перенес наш проект из Delphi 7 в Delphi 2010. После добавления некоторых типов приведений теперь мой проект работает хорошо, и все функции работают правильно, кроме основной функциональности программы, которая привязана к COM-портам и компоненту MSCOMM ActiveX.

Он может читать и писать с COM-порта, но кажется, что с этим что-то не так, потому что устройство, подключенное к этому порту, возвращает код ошибки, хотя и работает правильно с тем же кодом в Delphi7. В коде, который вы видите ниже после отправки нескольких байтов на устройство, байт отправляется как контрольная сумма. С другой стороны, устройство получает байты и вычисляет контрольную сумму по той же формуле, если полученная контрольная сумма была равна вычисленной контрольной сумме, устройство возвращает «O» как OK, иначе оно возвращает «E» как Error. 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 ]

2 голосов
/ 14 февраля 2010

Chr теперь возвращает Unicode WideChar (до Delphi 2009, он возвращал однобайтовый AnsiChar ).

Самое простое решение - перевести байтовые значения в ansischar:

var_ansichar := AnsisChar(var_byte);

вместо использования Chr (). Но обратите внимание, что говорит Мги . Убедитесь в правильности ввода ваших компонентов, объявленных переменных и т. Д. (AnsiChar, AnsiString и т. Д.).

1 голос
/ 15 февраля 2010

Поскольку вы до сих пор не опубликовали никакой информации об используемых типах данных, я не буду вдаваться в проблемы, которые могут возникнуть в вашем коде, но я также думаю, что тип char, имеющий ширину в два байта в Delphi 2009+, является наиболее вероятным причина, по которой ваш код больше не работает правильно.

Однако, если бы у меня была такая проблема, я бы определенно сначала проверил, какие байты отправляются через последовательное соединение. Для этого вы можете использовать Portmon для Windows , инструмент SysInternals, который использует API фильтрации драйверов для параллельных и последовательных интерфейсов и, таким образом, способен отображать все вызванные функции API и все байты данных, отправленные и полученные. Запустите его только с включенным COM-портом, через который вы подключаетесь, и проверьте данные, отправленные с ПК на внешнее устройство. Если вы видите много $00 байтов между вашими байтами данных, вы отправляете широкие символы вместо символов Ansi, и исправление типов данных должно исправить ситуацию.

...