Я написал простое приложение на C # 2.0, использующее класс .Net Framework 2.0 Serialport для связи с картой контроллера через COM1.
В последнее время возникла проблема, когда байты, возвращенные методом Read, неверны. Он вернул правильное количество байтов, только значения были неправильными. Подобное приложение, написанное на Delphi, все же вернуло правильные значения.
Я использовал Portmon для регистрации активности на последовательном порте обоих приложений, сравнил два журнала и там, где были некоторые (очевидно) незначительные различные настройки, и я попытался имитировать приложение Delphi так же близко, как и возможно, но безрезультатно.
Итак, что может повлиять на байтовые значения, возвращаемые методом Read?
Большинство настроек между двумя приложениями идентичны.
Вот список строк, которые отличались в журнале Portmon:
Приложение Delphi:
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF: dc
ERR: 0 BRK: 0 EVT: 0 XON: 11 XOFF: 13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake: 0
Заменить: 0 XonLimit: 256
XoffLimit: 256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI: -1
RM: 100 RC: 1000 WM: 100 WC: 1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Маска:
RXCHAR RXFLAG TXEMPTY CTS DSR RLSD
BRK ERR RING RX80FULL
C # Приложение:
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF: 1a
ERR: 0 BRK: 0 EVT: 1a XON: 11 XOFF: 13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake: 0
Заменить: 0 XonLimit: 1024
XoffLimit: 1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI: -1
RM: -1 RC: 1000 WM: 0 WC: 1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Маска:
RXCHAR RXFLAG CTS DSR RLSD BRK ERR
RING
UPDATE:
Правильные возвращенные байты были: 91, 1, 1, 3, 48, 48, 50, 69, 66, 51, 70, 55, 52, 93 (14 байтов).
Последнее значение - простая контрольная сумма.
Были возвращены неверные значения: 91, 241, 254, 252, 242, 146, 42, 201, 51, 70, 55, 52, 93 (13 байтов).
Как видите, первый и последние пять возвращенных байтов соответствуют.
Событие ErrorReceived указывает, что произошла ошибка кадрирования, которая может объяснить неправильные значения. Но вопрос в том, почему SerialPort может столкнуться с ошибкой кадрирования, а приложение Delphi, по-видимому, этого не делает?