Old1 0 3 августа, 2005 Опубликовано 3 августа, 2005 · Жалоба Решая свои задачи связанные с работой с коммуникационным портом создал VCL-компонент, предлагаю его для обсуждения. Компонент KlientServComConnect для Delphi5-7 (класс TKlientServComConnect) является не визуальным компонентом на базе класса TComponent. Компонент имеет мощные возможности по работе с Com-портами, модемами, позволяет создавать клиент-серверные приложения, взаимодействующие между собой по DualUp-соединению или по нуль-модему. Возможности компонента KlientServComConnect: - Настройка Com-порта. - Запись в Com-порт. - Чтение из Com-порта. - Обработка событий Com-порта. - Передача команд модему. - Получение результатов команд модема. - Автоматический набор номера модемом (набор номера определенное количество раз, установленное в соответствующем свойстве, с выводом результата набора). - Установка соединения модемом, после набора номера вручную. - Передача данных между приложениями через DualUp-соединение или нуль-модем (текст, файлы, буфер, команды). - Параллельная передача данных. К примеру, одновременно можно передавать текст и файл. - Одновременная передача данных в обе стороны. К примеру, с одной стороны приложение передает файл, а с другой текст или тоже файл. Компонент имеет подробную справочную систему, а также реализовано 2 примера с исходным кодом - Klient и Server, представляющих собой полнофункциональные приложения клиента и сервера. Между приложениями реализованы обмен текстом, файлами, причем это можно делать параллельно и одновременно. Также у клиентского приложения есть возможность получать структуру каталогов сервера, выбирать файл и закачивать его. Компонент FreeWare. Дистрибутив в присоединенном файле. Жду критики, советов, замечаний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Компонент хорошо установился в Delphi6. Проверил прием/передачу на заглушку порта(контакт 2 ->3). Открывается,закрывается порт нормально. В подобных компонентах есть событие по приему определенного пакета.Например ~xxxxxxx}.В этом я не нашел.Понимаю,что все было направлено на работу с модемом и большим обьемом данных, но COM-порт используется и для управления процессами.А там, лучше пропустить одну посылку,чем принять неправильную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy 0 29 сентября, 2005 Опубликовано 29 сентября, 2005 · Жалоба Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения: - удалены несколько выявившихся багов; - добавлен дополнительный метод чтения при работе с COM-портом; - добавлены 2 примера, демонстрирующие работу с COM-портом и модемом. Новая версия в присоединенном файле. Старую версию убрал. <{POST_SNAPBACK}> Ком порт, да ещё и на дельфи? Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники). Хотя слова "является не визуальным компонентом на базе класса TComponent" согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное. Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения: - удалены несколько выявившихся багов; - добавлен дополнительный метод чтения при работе с COM-портом; - добавлены 2 примера, демонстрирующие работу с COM-портом и модемом. Новая версия в присоединенном файле. Старую версию убрал. <{POST_SNAPBACK}> Ком порт, да ещё и на дельфи? Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники). Хотя слова "является не визуальным компонентом на базе класса TComponent" согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное. Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя? <{POST_SNAPBACK}> Что на Delphi, что на VC++ одинаково.Все используют API-функции Windows. На Delphi проще.Майкрософт монополизировала написание драйверов , но это не на долго.Уже много функций переписано под Delphi.И вообще в Windows лезть нечего.Вы как "железячник" понимаете , что глупо писать специальный драйвер для приема последовательности импульсов портом компьютера.Это проще выполнить с помощью контроллера,а его связать по Com-порту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Если Вы скачали последнюю версию (ту которая сейчас доступна), то после установки компонента, в каталоге установки сможете найти пример работы с 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]. (в данном примере модем используется как источник данных, на его месте может быть иное устройство). В подобных компонентах есть событие по приему определенного пакета.Например ~xxxxxxx}.В этом я не нашел.Понимаю,что все было направлено на работу с модемом и большим обьемом данных, но COM-порт используется и для управления процессами.А там, лучше пропустить одну посылку,чем принять неправильную. <{POST_SNAPBACK}> Спасибо за замечание, про эту фичу не знал, в следующих версиях, наверное, добавлю, но то что Вам нужно, можно сделать и имеющимися возможностями (только несколько сложнее) :) ЗЫ Нахожусь на работе, приду домой могу сбросить на мыло рег.номер (если нужно). :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Все методы и события просмотрел внимательно.Ну на серьезный тест нет времени.То о чем я говорил есть в компонентах APRO фирмы TurboPower.Очень удобная штука.Очень разгружает программиста при контроле посылок.Там можно ставить и маски. Думаю это усилит ваш компонент.Успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя? <{POST_SNAPBACK}> Детектирование портов делаю при помощи ф-ции API EnumPorts... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 30 сентября, 2005 Опубликовано 30 сентября, 2005 · Жалоба Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя? <{POST_SNAPBACK}> Детектирование портов делаю при помощи ф-ции API EnumPorts... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 1 октября, 2005 Опубликовано 1 октября, 2005 · Жалоба Ком порт, да ещё и на дельфи? Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники). По поводу VC++ или какого другого языка: каждый охотник хвалит свое ружье :) А вообще планирую с компаньеном написать тоже самое для билдера... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy 0 2 октября, 2005 Опубликовано 2 октября, 2005 · Жалоба Детектирование портов делаю при помощи ф-ции API EnumPorts... <{POST_SNAPBACK}> А я классом функций SetupDiGetClassDevs всё детектирую... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 3 октября, 2005 Опубликовано 3 октября, 2005 · Жалоба Ключ получил.Большое спасибо.Постараюсь оказать посильную помощь в тестировании компонента. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy 0 3 октября, 2005 Опубликовано 3 октября, 2005 · Жалоба Детектирование портов делаю при помощи ф-ции API EnumPorts... <{POST_SNAPBACK}> Чёт, может я чёто не так делаю... Всё время на любой тачке, EnumPorts вот такой список выдаёт: MSFAX: Факсовый порт COM1: Локальный порт COM2: Локальный порт COM3: Локальный порт COM4: Локальный порт FILE: Локальный порт LPT1: Локальный порт LPT2: Локальный порт LPT3: Локальный порт : Локальный порт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 3 октября, 2005 Опубликовано 3 октября, 2005 · Жалоба Детектирование портов делаю при помощи ф-ции API EnumPorts... Все верно. Функция возвращает список всех возможных портов в системе. Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy 0 3 октября, 2005 Опубликовано 3 октября, 2005 · Жалоба Все верно. Функция возвращает список всех возможных портов в системе. Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта. Грустна. Значит будем продолжать и дальше пользовать SetupDiGet... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy 0 3 октября, 2005 Опубликовано 3 октября, 2005 · Жалоба Детектирование портов делаю при помощи ф-ции API EnumPorts... Все верно. Функция возвращает список всех возможных портов в системе. Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта. <{POST_SNAPBACK}> Вот те вариант по проще, из моей компаненты для 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться