Опыт межкомпьютерной и внутрикомпьютерной коммуникации с использованием COM-портов

Jul 23, 2016 23:43

   Пишу программы для электрофизиологического эксперимента. В установке три компьютера: командный, стимулирующий и регистрирующий. Командный управляет двумя другими с помощью COM-портов. Поэтому и программу пишу не одну, а три. Пишу дома, а не там, где они будут работать. А программы иногда требуется проверять, ведь я могу что-то не то написать. Но на одном компьютере у меня только один COM-порт, а на другом его вообще нет. Раньше для проверки к компьютеру с COM-портом подключали старый ноутбук, тоже имеющий COM-порт, и отлаживали установку с двумя соединёнными компьютерами. Вчера я снова достал этот ноутбук, несколько раз пытался его загрузить, но, увы, следует констатировать, что он умер. Постоянно перезагружается. В режиме защиты от сбоев, правда, работает относительно стабильно, но в таком режиме не читаются флешки, а ведь нужно как-то программу на ноутбук записать. Есть, конечно, дискеты...
   Таким образом, остался один компьютер с COM-портом. Восстанавливать ноутбук смысла нет, желания уже тоже нет, подозреваю, что и возможности такой уже практически нет. Решил пойти другим путём. Есть виртуальные машины Windows XP mode, в них, как написано в файле справки, можно по-разному организовать виртуальный COM-порт. Можно связать его с физическим портом, связать с именованным каналом или с текстовым файлом на хост-машине. Утверждается, что, если два порта связать с одним именованным каналом, то получится виртуальный нуль-модемный кабель - то, что нужно. Причём для этого даже не нужно двух виртуальных машин - достаточно одной с двумя портами, связанными с одним каналом. Попробовал сделать это - однако почему-то не работает, данные с порта на порт не передаются.
   Стал искать в Интернете, но, как обычно, начал не с того конца - искал именно про виртуальные машины. Прочитал про разные машины - про VirtualBox, про VMWare, про какие-то ещё, но речь в этих текстах шла, в основном, о настройке портов. Где-то вариантов настройки было больше, где-то меньше, а про неудачный опыт использования и выход из положения ничего не нашёл. Пролистав несколько страниц результатов поиска в Яндексе случайно наткнулся на ссылку на сайт "Ответы mail.ru". Не очень-то надеясь найти там ответ на свой вопрос кликнул по ссылке. Ситуация описана похожая: человеку нужно передать (в качестве учебной задачи) данные через COM-порт, а порта под рукой нет, и ему тоже приходит в голову использовать виртуальные машины, он спрашивает, как это сделать. Другой человек предлагает установить программу-эмулятор COM-портов VSPE, создать в ней связанную пару виртуальных портов, связать один из этих портов с портом в виртуальной машине, и в ней запускать одну из программ, другой порт из этой пары использовать в хост-машине.
   Тут я понял, что, если так вот просто можно создать пару виртуальных портов, то виртуальная машина уже не нужна. А когда я установил эту программу, то оказалось, что всё ещё чуть проще - не нужна пара портов, достаточно одного. Две программы в одном компьютере могут общаться через один общий виртуальный порт - в отличие от реальных физических портов. (Если одна программа захватила физический порт, то в другой его уже не открыть.) Проверил - увы, данные всё равно не передаются.
   Заподозрил, что виртуальные порты не понимают функцию TransmitCommChar(hCommDev: Integer; const chTransmit: char). Всюду в программе заменил её на громоздкую WriteFile(hCommDev: Integer; var Buffer; const BytesToWrite: Integer; var BytesWritten: dWord; nil). И заработало!
   Удивительное впечатление произвела на меня синхронная работа двух программ на одном компьютере. Ведь раньше мы специально сделали установку из трёх связанных друг с другом компьютеров, чтобы программы в них работали одновременно, но независимо. Объединить хотя бы два компьютера (командный и стимулирующий) в один тогда казалось задачей слишком сложной: нужно было в одной программе сразу предусмотреть слишком много (тогда, конечно, это мыслилось делать в рамках одной программы). А теперь всё это работает на одном компьютере, причём без переделок программ. (Замену TransmitCommChar на WriteFile можно не считать переделкой.) Т.е. не просто сбылась мечта, казавшаяся несбыточной, а ещё и без приложения усилий!
   Тут я, конечно, подумал, что и соединение виртуальных машин не заработало из-за функции TransmitCommChar - возможно, она не работает и с портами виртуальной машины. Но это не так - даже переделанные программы всё равно не удалось связать через общий именованный канал, ассоциированный с COM-портами виртуальной машины.

Компьютерные страданья, windows

Previous post Next post
Up