igorle 0 19 ноября, 2012 Опубликовано 19 ноября, 2012 · Жалоба У нас на фирме (программистской) разрабатываются программы для коробок с СОМ портом. Реально используются только линии Tx Rx. Я спаял небольшое устройство, сквозь которое пропускаю COM порт и питание. Линия DTR (Data Ready) или RTS (Redy to Send) используется для управленикем реле. Таким образом можно включать/выключать питание коробки. На Linux все работает замечательно - можно или посылать сигнал с minicom, или использовать простой скрипт из шелла. Все разработчики пользуются и довольны. А с тестерами беда - они работают под Windows, а я не знаю как там управлять этими сигналами. По умолчанию получается так - включил программу терминла (putty, например) - устройство включилось. Вышел из программы - выключилось. Это не то что мне надо. Мне надо независимо от терминальной программы управлять. Или в крайнем случае из программы, но без того чтобы закрывать/запускать ее. Кто-нибудь знает как помочь делу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
paskal 1 19 ноября, 2012 Опубликовано 19 ноября, 2012 · Жалоба Функция EscapeCommFunction. Парамерты CLRDTR, CLRRTS итд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 19 ноября, 2012 Опубликовано 19 ноября, 2012 (изменено) · Жалоба Функция EscapeCommFunction. Парамерты CLRDTR, CLRRTS итд Раздел для начинающих, так что.... Можно в порядке оказания шефской помощи попросить исходник и ехе? Например один - хардкодед ставит DTR у COM7, а другой - очищает DTR у COM7. А я после проверки доработаю - научусь компилировать и добавлю обработку ошибок и параметры командной строки. Я на Винде вообще ничего не делаю. :( Что-то навроде этого? : #include <???> #include <string.h> int main(int argc, char *argv[]) { HANDLE handlePort = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (!handlePort) return error("Ooops!"); EscapeCommFunction(handlePort, !strcmp(argv[2], "On") ? SETDTR : CLRDTR); CloseHandle(handlePort); return 0; } Изменено 19 ноября, 2012 пользователем igorle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 19 ноября, 2012 Опубликовано 19 ноября, 2012 (изменено) · Жалоба Ваша программа выполнится и закроет порт - параметры возврятятся в тот состояние, что система делает для неоткрытых программами портов. Ловите программу и исходники. if (!handlePort) return error("Ooops!"); Советую почитать документацию на функции, которые используете. hint: CreateFile возвращает не NULL в случае неудавшейся попытки открыть порт. Изменено 19 ноября, 2012 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 46 19 ноября, 2012 Опубликовано 19 ноября, 2012 · Жалоба Genadi Zawidowski, а вы тоже не знаете способа сделать СОМ-порту "суспендид" (поставить на паузу по приёму), при НЕ ЗАКРЫВАЯ ему хендэл? Какую-нибудь палку в колёса :) можно ли ему вставить, чтобы он свою пасть заткнул (в свой буфер принимать перестал)? Скажем, в случае, когда внешнее устройство не слушается сигналов на линиях DTR/DSR и, не смотря ни на что, долбит свои байты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 ноября, 2012 Опубликовано 20 ноября, 2012 (изменено) · Жалоба Не знаю... какой-нибудь режим loopback есть? В классическом 16550 он был, win32 api делался под его возможности (похоже)... Снизить скорость до минимума. Тут есть ещё интереснее проблема, проявляющаяся вот в таком сценарии: 0) по линии RXD идёт какая-то передача. 1) открываю порт (он настраивается на скорость и формат, которые в панели управления по умолчанию стоят). 2) порт срабатывает по frame error. 3) пытаюсь установить режим с игнорированием ошибок fAbortOnError=TRUE (или любое другое обращение, скорость поменять) и обламываюсь с ошибкой. 4) если считать что за ошибка и успеть перепрограммировать на нужный формат/скорость, frame error тоже имеет право появиться при непрерывной передаче. Кто знает, как обойтись в этом сценарии без "успеть" в четвёртом пункте? upd: посмотрел - режима loopback нет. Вот успел всё забыть... Можете очищать буфер приёма. Но, в Вашем случае, Ксения, может не помочь, если purge делается не на самом низком уровне - хотя это всёможно посмотреть, заглянув в исходники в DDK (там serial device есть целиком). Изменено 20 ноября, 2012 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Хотя, в современном мире, в случае применения COМ-порта с win32 скорее всего будем иметь дело с FDI или ещё чем-нибудь - а там уже своит библиотеки обычно есть. Надо в них "заныривать". Например, я избавился от некоторых проблем с порчей данных на приёме просто перейдя на FTDI-шную библиотеку - при этом программа минимально редактируется - в основном к именам функций префиксы добавляются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба 2 Genadi Zawidowski Спасибо большое. Проверил программу. Она работает замечательно. Единственная моя проблемма - она не работает одновременно с терминальной программой. Судя по всему putty не согласен шэрить порт :( Боюсь что это нерешаемая задача под Виндоус Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Я нашел решение. Пока все работает. Есть такая терминальная программа Realterm Позволяет управлять DTR прямо из окна. Декларируют что поддерживают скрипты. Кстати, не сочтите за наглость, но покажу устройство о котором речь :) Может для вас это и смешно, но мне как любителю жутко нравится. Опять-таки - сам сваял :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться