Как прочесть состояние COM-порта
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Как прочесть состояние COM-порта
Задача: по внешнему физическому событию (нажатие тревожной кнопки) программа на Clarion должна выполнить некие действия. Напрограммировать действие удалось без проблем.
Как заметить событие?
Поскольку внешний мир для ПК - это скорее всего состояние портов,
как наиболее просто обратиться к COM-порту?
Я так понимаю, что для этих целей существуют Windows API, но до сих пор ни разу не приходилось пользоваться...
Если есть опыт или хотя бы мнение по поводу способов решения задачи, подскажите пожалуйста.
Как заметить событие?
Поскольку внешний мир для ПК - это скорее всего состояние портов,
как наиболее просто обратиться к COM-порту?
Я так понимаю, что для этих целей существуют Windows API, но до сих пор ни разу не приходилось пользоваться...
Если есть опыт или хотя бы мнение по поводу способов решения задачи, подскажите пожалуйста.
- Andrew Listiev
- Активист
- Сообщения: 166
- Зарегистрирован: 07 Июль 2005, 11:16
- Откуда: Латвия, Рига
Приветствую!
Как ты уже отметил, лучше использовать Win API. В своё время написал хороший набор классов для работы с последовательным портом. По личному опыту могу сказать, что лучше не придумать, полная свобода. Есть сторонние библиотеки, такие как ClaCom (вроде так, насколько помню , только платные) пользовал также. Довольно приличные. Есть MSCom.ocx (опять-таки могу ошибиться в названии). Так что есть поле для исследований
Как ты уже отметил, лучше использовать Win API. В своё время написал хороший набор классов для работы с последовательным портом. По личному опыту могу сказать, что лучше не придумать, полная свобода. Есть сторонние библиотеки, такие как ClaCom (вроде так, насколько помню , только платные) пользовал также. Довольно приличные. Есть MSCom.ocx (опять-таки могу ошибиться в названии). Так что есть поле для исследований
Написал код на Дельфи. Всего две функции:
1. открыть порт (CreateFile).
2. прочесть его состояние.
Выглядит это так:
Работает. Значение vStatus прекрасно отражает текущее состояние входов порта.
Хочу написать это на Clarion, но не знаю и не нашел пока как описать тип данных указатель (handle) на файл.
Пробовал объявить прототип функции CreateFile, как указано в справочнике по WinAPI, имеющемуся в примерах, вот так:
но компилятор сразу ругается на возвращаемый тип HANDLE - illegal return type. Подскажите, кто знает, как составить правильное описание?
1. открыть порт (CreateFile).
2. прочесть его состояние.
Выглядит это так:
Код: Выделить всё
<декларация переменных>
hport: THandle;
vStatus: dword;
<однократно исполняемый код>
hport := CreateFile('COM1',
GENERIC_READ,
0,
nil,
OPEN_EXISTING,
0,
0);
Win32Check(hport <> INVALID_HANDLE_VALUE);
<код, исполняемый по таймеру>
Win32Check(GetCommModemStatus(hport,vStatus));
Хочу написать это на Clarion, но не знаю и не нашел пока как описать тип данных указатель (handle) на файл.
Пробовал объявить прототип функции CreateFile, как указано в справочнике по WinAPI, имеющемуся в примерах, вот так:
Код: Выделить всё
CreateFileA(*LPCSTR,DWORD,DWORD,*SECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE),HANDLE,PASCAL,RAW
Спасибо, я продвинулся!
Все собралось, и порт открылся. Но при попытке получить статус - ошибка. В чем может быть проблема?
Выглядит так:
Вызов GetCommModemStatus возвращает 0 (ошибка) и значение vStatus всегда остается нулем независимо от состояния порта. При этом код на Дельфи (см. первое сообщение) работает, и состояние порта отслеживается.
Знатоки, помогите заблудшему.
Все собралось, и порт открылся. Но при попытке получить статус - ошибка. В чем может быть проблема?
Выглядит так:
Код: Выделить всё
<Equates>
GENERIC_READ EQUATE(80000000h)
OPEN_EXISTING EQUATE(3)
INVALID_HANDLE_VALUE EQUATE(-1)
BOOL EQUATE(SIGNED)
DWORD EQUATE(ULONG)
HANDLE EQUATE(UNSIGNED)
LPCSTR EQUATE(CSTRING)
<прототипы>
CreateFile(*LPCSTR,DWORD,DWORD,DWORD,DWORD,DWORD,HANDLE),HANDLE,PASCAL,RAW,NAME('CreateFileA')
GetCommModemStatus(HANDLE,DWORD),BOOL,PASCAL,RAW,NAME('GetCommModemStatus')
PortCOM1 cstring('COM1')
hPort long
vStatus long
<однократно открыли порт>
hPort = CreateFile(PortCOM1,GENERIC_READ,0,0,OPEN_EXISTING,0,0)
IF hPort = INVALID_HANDLE_VALUE
message('Порт COM1 открыть не удалось.')
.
<по таймеру запрашиваем статус>
IF GetCommModemStatus(hPort,vStatus).
Знатоки, помогите заблудшему.
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
GetCommModemStatus неверно описан, смотри внимательнее в MSDN, второй параметр это out и соотвественно должен быть описан как *DWORD или что-тоже *LONG
чтобы узнать почему ошибка см GetLastError.
кстати в описании говорится, что эта функция GetCommModemStatus должна использоваться вместе с WaitCommEvent
чтобы узнать почему ошибка см GetLastError.
кстати в описании говорится, что эта функция GetCommModemStatus должна использоваться вместе с WaitCommEvent
StillZero, действительно я проигнорировал тип параметра out, хуже того - даже и не знал, что это есть передача по ссылке...
Все заработало, спасибо!
Что касается использования WaitCommEvent: в описании не сказано, что ее использование обязательно, просто функция позволяет избавиться от необходимости циклического вызова GetCommModemStatus. В моем конкретном случае в программе уже имеется таймер и его обработчик, поэтому я решил не возиться с еще одной функцией, а организовать именно циклический вызов.
Все заработало, спасибо!
Что касается использования WaitCommEvent: в описании не сказано, что ее использование обязательно, просто функция позволяет избавиться от необходимости циклического вызова GetCommModemStatus. В моем конкретном случае в программе уже имеется таймер и его обработчик, поэтому я решил не возиться с еще одной функцией, а организовать именно циклический вызов.
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
еще вот посмотри: http://files.clarionlife.net/dialer.zip
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re:
Зарегистрировался в приват, получил разрешение админа, но скачать не могу мой login и password не проходят.Admin писал(а):еще вот посмотри: http://files.clarionlife.net/dialer.zip
Ч.Д.
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Re:
Читаем тут: http://forum.clarionlife.net/phpbb/view ... =15&t=1326han писал(а):Зарегистрировался в приват, получил разрешение админа, но скачать не могу мой login и password не проходят.Admin писал(а):еще вот посмотри: http://files.clarionlife.net/dialer.zip
Ч.Д.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса