Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компонент Klientservcomconnect для Delphi
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Old1
Решая свои задачи связанные с работой с коммуникационным портом создал VCL-компонент, предлагаю его для обсуждения.
Компонент KlientServComConnect для Delphi5-7 (класс TKlientServComConnect) является не визуальным компонентом на базе класса TComponent. Компонент имеет мощные возможности по работе с Com-портами, модемами, позволяет создавать клиент-серверные приложения, взаимодействующие между собой по DualUp-соединению или по нуль-модему.
Возможности компонента KlientServComConnect:
- Настройка Com-порта.
- Запись в Com-порт.
- Чтение из Com-порта.
- Обработка событий Com-порта.
- Передача команд модему.
- Получение результатов команд модема.
- Автоматический набор номера модемом (набор номера определенное количество раз, установленное в соответствующем свойстве, с выводом результата набора).
- Установка соединения модемом, после набора номера вручную.
- Передача данных между приложениями через DualUp-соединение или нуль-модем (текст, файлы, буфер, команды).
- Параллельная передача данных. К примеру, одновременно можно передавать текст и файл.
- Одновременная передача данных в обе стороны. К примеру, с одной стороны приложение передает файл, а с другой текст или тоже файл.

Компонент имеет подробную справочную систему, а также реализовано 2 примера с исходным кодом - Klient и Server, представляющих собой полнофункциональные приложения клиента и сервера. Между приложениями
реализованы обмен текстом, файлами, причем это можно делать параллельно и одновременно. Также у клиентского приложения есть возможность получать структуру каталогов сервера, выбирать файл и закачивать его.

Компонент FreeWare. Дистрибутив в присоединенном файле. Жду критики, советов, замечаний.
upc2
Компонент хорошо установился в Delphi6.
Проверил прием/передачу на заглушку порта(контакт 2 ->3).
Открывается,закрывается порт нормально.
В подобных компонентах есть событие по приему определенного
пакета.Например ~xxxxxxx}.В этом я не нашел.Понимаю,что все
было направлено на работу с модемом и большим обьемом данных,
но COM-порт используется и для управления процессами.А там,
лучше пропустить одну посылку,чем принять неправильную.
Trashy
Цитата(Old1 @ Sep 12 2005, 10:39)
Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения:
- удалены несколько выявившихся багов;
- добавлен дополнительный метод чтения при работе с COM-портом;
- добавлены 2 примера, демонстрирующие работу с COM-портом и модемом.
Новая версия в присоединенном файле. Старую версию убрал.
*


Ком порт, да ещё и на дельфи?
Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники).

Хотя слова "является не визуальным компонентом на базе класса TComponent"
согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное.
Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?
upc2
Цитата(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-порту.
Old1
Если Вы скачали последнюю версию (ту которая сейчас доступна), то после установки компонента, в каталоге установки сможете найти пример работы с 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-порт используется и для управления процессами.А там,
лучше пропустить одну посылку,чем принять неправильную.
*

Спасибо за замечание, про эту фичу не знал, в следующих версиях, наверное, добавлю, но то что Вам нужно, можно сделать и имеющимися возможностями (только несколько сложнее)

smile.gif
ЗЫ Нахожусь на работе, приду домой могу сбросить на мыло рег.номер (если нужно). smile.gif
upc2
Все методы и события просмотрел внимательно.Ну на серьезный
тест нет времени.То о чем я говорил есть в компонентах APRO
фирмы TurboPower.Очень удобная штука.Очень разгружает
программиста при контроле посылок.Там можно ставить и маски.
Думаю это усилит ваш компонент.Успехов.
Old1
Цитата(Trashy @ Sep 29 2005, 21:02)
Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?
*

Детектирование портов делаю при помощи ф-ции API EnumPorts...
Old1
Цитата(Trashy @ Sep 29 2005, 21:02)
Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?
*

Детектирование портов делаю при помощи ф-ции API EnumPorts...
Old1
Цитата(Trashy @ Sep 29 2005, 21:02)
Ком порт, да ещё и на дельфи?
Из семидесяти инженеров нашего предприятия, ни один такой весчью не заинтересуется (на Дельфях два-три человека сидят и те не железячники).

По поводу VC++ или какого другого языка: каждый охотник хвалит свое ружье smile.gif
А вообще планирую с компаньеном написать тоже самое для билдера...
Trashy
Цитата(Old1 @ Sep 30 2005, 19:35)
Детектирование портов делаю при помощи ф-ции API EnumPorts...
*


А я классом функций SetupDiGetClassDevs всё детектирую...
upc2
Ключ получил.Большое спасибо.Постараюсь оказать
посильную помощь в тестировании компонента.
Trashy
Цитата(Old1 @ Sep 30 2005, 19:35)
Детектирование портов делаю при помощи ф-ции API EnumPorts...
*

Чёт, может я чёто не так делаю...
Всё время на любой тачке, EnumPorts вот такой список выдаёт:
MSFAX:
Факсовый порт
COM1:
Локальный порт
COM2:
Локальный порт
COM3:
Локальный порт
COM4:
Локальный порт
FILE:
Локальный порт
LPT1:
Локальный порт
LPT2:
Локальный порт
LPT3:
Локальный порт
:
Локальный порт
Old1
[quote=Trashy,Oct 3 2005, 12:04]
[quote=Old1,Sep 30 2005, 19:35]Детектирование портов делаю при помощи ф-ции API EnumPorts...
[/quote]
Все верно. Функция возвращает список всех возможных портов в системе.
Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта.
Trashy
Цитата(Old1 @ Oct 3 2005, 12:30)
Все верно. Функция возвращает список всех возможных портов в системе.
Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта.


Грустна. Значит будем продолжать и дальше пользовать SetupDiGet...
Trashy
[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;
}
Old1
Цитата(Trashy @ Oct 3 2005, 14:41)
Вот те вариант по проще, из моей компаненты для LPT.
Детектирует все ЛПТ физически существующие.
Если ЛПТ заменить на КОМ, то будет крута. Но только в 98 криво пашет.

За пример спасибо. Но я, честно говоря, не вижу особого смысла в детектировании физических портов. Ведь юзер сначала подключает девайс, а потом запускает софтину. А раз девайс подключен значит порт есть...
Old1
Вышла новая версия компонента KlientServComConnect. Что нового:
- Удалены несколько выявившихся багов
- Добавлена возможность выбора модема, в зависимости от установленного оборудования
(см. свойство TModem.ModemName, метод TModem.EnumModems), что улучшило качество связи,
так как инициализация модема и порта осуществляется в соответствии с inf-файлом
выбранногог модема
- Добавилась возможность чтения любого объема данных передаваемых модемом порту в
командном режиме (в предыдущей версии объем данных ограничивался размером буфера модема).
Предыдущую версию удалил...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.