Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление СОМ портом под Windows
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
igorle
У нас на фирме (программистской) разрабатываются программы для коробок с СОМ портом. Реально используются только линии Tx Rx. Я спаял небольшое устройство, сквозь которое пропускаю COM порт и питание. Линия DTR (Data Ready) или RTS (Redy to Send) используется для управленикем реле. Таким образом можно включать/выключать питание коробки.

На Linux все работает замечательно - можно или посылать сигнал с minicom, или использовать простой скрипт из шелла. Все разработчики пользуются и довольны. А с тестерами беда - они работают под Windows, а я не знаю как там управлять этими сигналами. По умолчанию получается так - включил программу терминла (putty, например) - устройство включилось. Вышел из программы - выключилось. Это не то что мне надо. Мне надо независимо от терминальной программы управлять. Или в крайнем случае из программы, но без того чтобы закрывать/запускать ее.

Кто-нибудь знает как помочь делу?
paskal
Функция EscapeCommFunction. Парамерты CLRDTR, CLRRTS итд
igorle
Цитата(paskal @ Nov 19 2012, 22:48) *
Функция EscapeCommFunction. Парамерты CLRDTR, CLRRTS итд

Раздел для начинающих, так что.... Можно в порядке оказания шефской помощи попросить исходник и ехе? Например один - хардкодед ставит DTR у COM7, а другой - очищает DTR у COM7. А я после проверки доработаю - научусь компилировать и добавлю обработку ошибок и параметры командной строки. Я на Винде вообще ничего не делаю. sad.gif
Что-то навроде этого? :
Код
#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;
}
Genadi Zawidowski
Ваша программа выполнится и закроет порт - параметры возврятятся в тот состояние, что система делает для неоткрытых программами портов.
Ловите программу и исходники.
Код
    if (!handlePort)
        return error("Ooops!");

Советую почитать документацию на функции, которые используете. hint: CreateFile возвращает не NULL в случае неудавшейся попытки открыть порт.
Xenia
Genadi Zawidowski, а вы тоже не знаете способа сделать СОМ-порту "суспендид" (поставить на паузу по приёму), при НЕ ЗАКРЫВАЯ ему хендэл?
Какую-нибудь палку в колёса sm.gif можно ли ему вставить, чтобы он свою пасть заткнул (в свой буфер принимать перестал)? Скажем, в случае, когда внешнее устройство не слушается сигналов на линиях DTR/DSR и, не смотря ни на что, долбит свои байты.
Genadi Zawidowski
Не знаю... какой-нибудь режим loopback есть? В классическом 16550 он был, win32 api делался под его возможности (похоже)...
Снизить скорость до минимума.
Тут есть ещё интереснее проблема, проявляющаяся вот в таком сценарии:

0) по линии RXD идёт какая-то передача.
1) открываю порт (он настраивается на скорость и формат, которые в панели управления по умолчанию стоят).
2) порт срабатывает по frame error.
3) пытаюсь установить режим с игнорированием ошибок fAbortOnError=TRUE (или любое другое обращение, скорость поменять) и обламываюсь с ошибкой.
4) если считать что за ошибка и успеть перепрограммировать на нужный формат/скорость, frame error тоже имеет право появиться при непрерывной передаче.

Кто знает, как обойтись в этом сценарии без "успеть" в четвёртом пункте?
upd: посмотрел - режима loopback нет. Вот успел всё забыть... Можете очищать буфер приёма. Но, в Вашем случае, Ксения, может не помочь, если purge делается не на самом низком уровне - хотя это всёможно посмотреть, заглянув в исходники в DDK (там serial device есть целиком).
Genadi Zawidowski
Хотя, в современном мире, в случае применения COМ-порта с win32 скорее всего будем иметь дело с FDI или ещё чем-нибудь - а там уже своит библиотеки обычно есть. Надо в них "заныривать". Например, я избавился от некоторых проблем с порчей данных на приёме просто перейдя на FTDI-шную библиотеку - при этом программа минимально редактируется - в основном к именам функций префиксы добавляются.
igorle
2 Genadi Zawidowski Спасибо большое. Проверил программу. Она работает замечательно. Единственная моя проблемма - она не работает одновременно с терминальной программой. Судя по всему putty не согласен шэрить порт sad.gif Боюсь что это нерешаемая задача под Виндоус
igorle
Я нашел решение. Пока все работает. Есть такая терминальная программа Realterm
Позволяет управлять DTR прямо из окна. Декларируют что поддерживают скрипты.

Кстати, не сочтите за наглость, но покажу устройство о котором речь sm.gif
Нажмите для просмотра прикрепленного файла
Может для вас это и смешно, но мне как любителю жутко нравится. Опять-таки - сам сваял sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.