|
Компонент Klientservcomconnect для Delphi, Работа с Com-портами, модемами |
|
|
|
Aug 3 2005, 07:29
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Решая свои задачи связанные с работой с коммуникационным портом создал VCL-компонент, предлагаю его для обсуждения. Компонент KlientServComConnect для Delphi5-7 (класс TKlientServComConnect) является не визуальным компонентом на базе класса TComponent. Компонент имеет мощные возможности по работе с Com-портами, модемами, позволяет создавать клиент-серверные приложения, взаимодействующие между собой по DualUp-соединению или по нуль-модему. Возможности компонента KlientServComConnect: - Настройка Com-порта. - Запись в Com-порт. - Чтение из Com-порта. - Обработка событий Com-порта. - Передача команд модему. - Получение результатов команд модема. - Автоматический набор номера модемом (набор номера определенное количество раз, установленное в соответствующем свойстве, с выводом результата набора). - Установка соединения модемом, после набора номера вручную. - Передача данных между приложениями через DualUp-соединение или нуль-модем (текст, файлы, буфер, команды). - Параллельная передача данных. К примеру, одновременно можно передавать текст и файл. - Одновременная передача данных в обе стороны. К примеру, с одной стороны приложение передает файл, а с другой текст или тоже файл.
Компонент имеет подробную справочную систему, а также реализовано 2 примера с исходным кодом - Klient и Server, представляющих собой полнофункциональные приложения клиента и сервера. Между приложениями реализованы обмен текстом, файлами, причем это можно делать параллельно и одновременно. Также у клиентского приложения есть возможность получать структуру каталогов сервера, выбирать файл и закачивать его.
Компонент FreeWare. Дистрибутив в присоединенном файле. Жду критики, советов, замечаний.
|
|
|
|
|
Sep 29 2005, 18:02
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 19-01-05
Пользователь №: 2 049

|
Цитата(Old1 @ Sep 12 2005, 10:39) Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения: - удалены несколько выявившихся багов; - добавлен дополнительный метод чтения при работе с COM-портом; - добавлены 2 примера, демонстрирующие работу с COM-портом и модемом. Новая версия в присоединенном файле. Старую версию убрал. Ком порт, да ещё и на дельфи? Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники). Хотя слова "является не визуальным компонентом на базе класса TComponent" согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное. Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?
|
|
|
|
|
Sep 30 2005, 05:38
|
Знающий
   
Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063

|
Цитата(Trashy @ Sep 29 2005, 21:02) Цитата(Old1 @ Sep 12 2005, 10:39) Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения: - удалены несколько выявившихся багов; - добавлен дополнительный метод чтения при работе с COM-портом; - добавлены 2 примера, демонстрирующие работу с COM-портом и модемом. Новая версия в присоединенном файле. Старую версию убрал. Ком порт, да ещё и на дельфи? Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники). Хотя слова "является не визуальным компонентом на базе класса TComponent" согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное. Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя? Что на Delphi, что на VC++ одинаково.Все используют API-функции Windows. На Delphi проще.Майкрософт монополизировала написание драйверов , но это не на долго.Уже много функций переписано под Delphi.И вообще в Windows лезть нечего.Вы как "железячник" понимаете , что глупо писать специальный драйвер для приема последовательности импульсов портом компьютера.Это проще выполнить с помощью контроллера,а его связать по Com-порту.
|
|
|
|
|
Sep 30 2005, 09:25
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Если Вы скачали последнюю версию (ту которая сейчас доступна), то после установки компонента, в каталоге установки сможете найти пример работы с Com-портом (…\KlientServComConnect\ExamplsD_\Work_with_comport\). Там реализовано пять вариантов приема данных из Сом-порта: 1-ый вариант- запись команды модема в порт, считывание из порта в буфер (когда срабатывает событие «появление символа»); 2-ой вариант-запись команды модема в порт, считывание из порта, когда буфер полон ; 3-ий вариант -запись команды модема в порт, считывание из порта в буфер до появления специального символа (KlientServComConnect1.ComPort.ComProp.EvtChar:=#10) свойство KlientServComConnect1.ComPort.EventMasks:=[mEV_RXFLAG]; 4-ый вариант-запись команды модема в порт, считывание из порта через 1 секунду после записи с использованием метода ReadPacket; 5-ый вариант - запись команды модема в порт, считывание из порта, с использованием метода ReadPacket, при появления специального символа (KlientServComConnect1.ComPort.ComProp.EvtChar:=#10) свойство KlientServComConnect1.ComPort.EventMasks:=[mEV_RXFLAG]. (в данном примере модем используется как источник данных, на его месте может быть иное устройство). Цитата(upc2 @ Sep 29 2005, 15:24) В подобных компонентах есть событие по приему определенного пакета.Например ~xxxxxxx}.В этом я не нашел.Понимаю,что все было направлено на работу с модемом и большим обьемом данных, но COM-порт используется и для управления процессами.А там, лучше пропустить одну посылку,чем принять неправильную. Спасибо за замечание, про эту фичу не знал, в следующих версиях, наверное, добавлю, но то что Вам нужно, можно сделать и имеющимися возможностями (только несколько сложнее) ЗЫ Нахожусь на работе, приду домой могу сбросить на мыло рег.номер (если нужно).
|
|
|
|
|
Oct 2 2005, 06:38
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 19-01-05
Пользователь №: 2 049

|
Цитата(Old1 @ Sep 30 2005, 19:35) Детектирование портов делаю при помощи ф-ции API EnumPorts... А я классом функций SetupDiGetClassDevs всё детектирую...
|
|
|
|
|
Oct 3 2005, 09:04
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 19-01-05
Пользователь №: 2 049

|
Цитата(Old1 @ Sep 30 2005, 19:35) Детектирование портов делаю при помощи ф-ции API EnumPorts... Чёт, может я чёто не так делаю... Всё время на любой тачке, EnumPorts вот такой список выдаёт: MSFAX: Факсовый порт COM1: Локальный порт COM2: Локальный порт COM3: Локальный порт COM4: Локальный порт FILE: Локальный порт LPT1: Локальный порт LPT2: Локальный порт LPT3: Локальный порт : Локальный порт
|
|
|
|
|
Oct 3 2005, 11:34
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 19-01-05
Пользователь №: 2 049

|
Цитата(Old1 @ Oct 3 2005, 12:30) Все верно. Функция возвращает список всех возможных портов в системе. Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта. Грустна. Значит будем продолжать и дальше пользовать SetupDiGet...
|
|
|
|
|
Oct 3 2005, 11:41
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 19-01-05
Пользователь №: 2 049

|
[quote=Old1,Oct 3 2005, 12:30] [quote=Trashy,Oct 3 2005, 12:04] [quote=Old1,Sep 30 2005, 19:35]Детектирование портов делаю при помощи ф-ции API EnumPorts... [/quote] Все верно. Функция возвращает список всех возможных портов в системе. Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта. [/quote] Вот те вариант по проще, из моей компаненты для LPT. Детектирует все ЛПТ физически существующие. Если ЛПТ заменить на КОМ, то будет крута. Но только в 98 криво пашет. Код FAnsiCompared = "LPT";
BYTE TLPT::Detection(void) { char *mass_data = new char[0x2000]; FNumberOfDevice = 0; FSelectedDevice = 0; name_device[0] = NULL; char * St; unsigned short int i = 0; AnsiString names_dos_device; QueryDosDevice(NULL,mass_data,0x2000); names_dos_device =(""); do { if (mass_data[i]==0) {St = strstr(names_dos_device.c_str(),FAnsiCompared.c_str()); if (St!=NULL) { FNumberOfDevice++; delete [] name_device[FNumberOfDevice]; name_device[FNumberOfDevice] = new char[90]; strcpy(name_device[FNumberOfDevice],"\\\\.\\"); strcat(name_device[FNumberOfDevice],St); } St =""; names_dos_device =(""); } else { names_dos_device = names_dos_device+mass_data[i]; } if ((mass_data[i]==0)&&(mass_data[i+1]==0)) {break;} i++; } while(i<0x2000); delete [] mass_data; if (FNumberOfDevice!=0) { FSelectedDevice = 1; } return FNumberOfDevice; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|