Как смоделировать отказ / обрыв кабеля с нуль-модемным эмулятором com0com
Вот краткий рассказ: мне нужно отладить некоторые очень специфические ошибки в нашем приложении. Приложение работает в дуплексной системе, состоящей из двух машин, соединенных последовательным кабелем; по этому кабелю обе машины обмениваются каким-то "сердцебиением". В очень редких непредсказуемых случаях на местах искажение сигнала в физической среде вызывало неправильное поведение. Мы можем частично воспроизвести его "брутально", просто сняв последовательный кабель.
Теперь для удобства я успешно эмулирую последовательный кабель с помощью нуль-модемного эмулятора com0com ( http://com0com.sourceforge.net/), чтобы оба процесса выполнялись на одной машине с использованием виртуальных COM-портов. Это работает отлично.
Мой вопрос: как я могу использовать com0com для симуляции обрыва кабеля / сбоя последовательного порта / искажения сигнала любого рода? Могу ли я, например, целенаправленно заблокировать один из виртуальных портов для отправки / получения данных?
1 ответ
Я наконец-то узнал, как я могу сделать это, используя com0com вместе с инструментом com2tcp (который является частью проекта com0com). Подход описан в этом документе: http://com0com.sourceforge.net/doc/UsingCom0com.pdf Проект com0com - это действительно полезная и удивительная вещь!
По сути, идея состоит в том, чтобы создать две пары виртуальных COM-портов на машине. В моем случае это: COM7 <-> COM8 и COM9 <-> COM10. Затем, используя утилиту com2tcp, я перенаправляю передачу данных между COM8 и COM10 через TCP. В двух консольных окнах я запускаю com2tcp один раз как сервер, один раз как клиент (как описано в документе выше). В частности, я использую com2tcp --telnet \\.\COM8 12345
(где 12345 - это некоторый номер порта TCP) и com2tcp.exe --telnet \\.\COM10 1.2.3.4 12345
(где 1.2.3.4 - это IP-адрес моей машины). COM7 и COM9 используются обоими экземплярами моего приложения, поэтому обмен данными происходит следующим образом: PROCESS1 <-> COM7 <-> COM8 <---- TCP ----> COM10 <-> COM9 <-> PROCESS2
, Затем, когда оба экземпляра приложения работают, я просто останавливаю процесс com2tcp, нажав CTRL+C
в консоли - и это нарушает связь между портами точно так же, как и разрыв кабеля! Таким образом, я мог легко моделировать и отлаживать поведение по мере необходимости.