реклама на сайте
подробности

 
 
> Управление СОМ портом под Windows, Как управлять RTS/DTR со стороны
igorle
сообщение Nov 19 2012, 18:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



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

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

Кто-нибудь знает как помочь делу?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
paskal
сообщение Nov 19 2012, 18:48
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Функция EscapeCommFunction. Парамерты CLRDTR, CLRRTS итд
Go to the top of the page
 
+Quote Post
igorle
сообщение Nov 19 2012, 20:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(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;
}


Сообщение отредактировал igorle - Nov 19 2012, 20:25
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 19 2012, 21:25
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ваша программа выполнится и закроет порт - параметры возврятятся в тот состояние, что система делает для неоткрытых программами портов.
Ловите программу и исходники.
Код
    if (!handlePort)
        return error("Ooops!");

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

Сообщение отредактировал Genadi Zawidowski - Nov 19 2012, 21:27
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 19 2012, 21:50
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Genadi Zawidowski, а вы тоже не знаете способа сделать СОМ-порту "суспендид" (поставить на паузу по приёму), при НЕ ЗАКРЫВАЯ ему хендэл?
Какую-нибудь палку в колёса sm.gif можно ли ему вставить, чтобы он свою пасть заткнул (в свой буфер принимать перестал)? Скажем, в случае, когда внешнее устройство не слушается сигналов на линиях DTR/DSR и, не смотря ни на что, долбит свои байты.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 20 2012, 00:56
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Не знаю... какой-нибудь режим loopback есть? В классическом 16550 он был, win32 api делался под его возможности (похоже)...
Снизить скорость до минимума.
Тут есть ещё интереснее проблема, проявляющаяся вот в таком сценарии:

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

Кто знает, как обойтись в этом сценарии без "успеть" в четвёртом пункте?
upd: посмотрел - режима loopback нет. Вот успел всё забыть... Можете очищать буфер приёма. Но, в Вашем случае, Ксения, может не помочь, если purge делается не на самом низком уровне - хотя это всёможно посмотреть, заглянув в исходники в DDK (там serial device есть целиком).

Сообщение отредактировал Genadi Zawidowski - Nov 20 2012, 08:29
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 20 2012, 08:49
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Хотя, в современном мире, в случае применения COМ-порта с win32 скорее всего будем иметь дело с FDI или ещё чем-нибудь - а там уже своит библиотеки обычно есть. Надо в них "заныривать". Например, я избавился от некоторых проблем с порчей данных на приёме просто перейдя на FTDI-шную библиотеку - при этом программа минимально редактируется - в основном к именам функций префиксы добавляются.
Go to the top of the page
 
+Quote Post
igorle
сообщение Nov 20 2012, 18:52
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



2 Genadi Zawidowski Спасибо большое. Проверил программу. Она работает замечательно. Единственная моя проблемма - она не работает одновременно с терминальной программой. Судя по всему putty не согласен шэрить порт sad.gif Боюсь что это нерешаемая задача под Виндоус
Go to the top of the page
 
+Quote Post
igorle
сообщение Nov 20 2012, 21:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



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

Кстати, не сочтите за наглость, но покажу устройство о котором речь sm.gif
Прикрепленное изображение

Может для вас это и смешно, но мне как любителю жутко нравится. Опять-таки - сам сваял sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 18:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016