Перейти к содержанию
    

Управление СОМ портом под Windows

У нас на фирме (программистской) разрабатываются программы для коробок с СОМ портом. Реально используются только линии Tx Rx. Я спаял небольшое устройство, сквозь которое пропускаю COM порт и питание. Линия DTR (Data Ready) или RTS (Redy to Send) используется для управленикем реле. Таким образом можно включать/выключать питание коробки.

 

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

 

Кто-нибудь знает как помочь делу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функция 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;
}

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваша программа выполнится и закроет порт - параметры возврятятся в тот состояние, что система делает для неоткрытых программами портов.

Ловите программу и исходники.

    if (!handlePort)
        return error("Ooops!");

Советую почитать документацию на функции, которые используете. hint: CreateFile возвращает не NULL в случае неудавшейся попытки открыть порт.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Genadi Zawidowski, а вы тоже не знаете способа сделать СОМ-порту "суспендид" (поставить на паузу по приёму), при НЕ ЗАКРЫВАЯ ему хендэл?

Какую-нибудь палку в колёса :) можно ли ему вставить, чтобы он свою пасть заткнул (в свой буфер принимать перестал)? Скажем, в случае, когда внешнее устройство не слушается сигналов на линиях DTR/DSR и, не смотря ни на что, долбит свои байты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю... какой-нибудь режим 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-шную библиотеку - при этом программа минимально редактируется - в основном к именам функций префиксы добавляются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 Genadi Zawidowski Спасибо большое. Проверил программу. Она работает замечательно. Единственная моя проблемма - она не работает одновременно с терминальной программой. Судя по всему putty не согласен шэрить порт :( Боюсь что это нерешаемая задача под Виндоус

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я нашел решение. Пока все работает. Есть такая терминальная программа Realterm

Позволяет управлять DTR прямо из окна. Декларируют что поддерживают скрипты.

 

Кстати, не сочтите за наглость, но покажу устройство о котором речь :)

post-72753-1353447304_thumb.jpg

Может для вас это и смешно, но мне как любителю жутко нравится. Опять-таки - сам сваял :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...