Перейти к содержанию
    

Компонент Klientservcomconnect для Delphi

Решая свои задачи связанные с работой с коммуникационным портом создал VCL-компонент, предлагаю его для обсуждения.

Компонент KlientServComConnect для Delphi5-7 (класс TKlientServComConnect) является не визуальным компонентом на базе класса TComponent. Компонент имеет мощные возможности по работе с Com-портами, модемами, позволяет создавать клиент-серверные приложения, взаимодействующие между собой по DualUp-соединению или по нуль-модему.

Возможности компонента KlientServComConnect:

- Настройка Com-порта.

- Запись в Com-порт.

- Чтение из Com-порта.

- Обработка событий Com-порта.

- Передача команд модему.

- Получение результатов команд модема.

- Автоматический набор номера модемом (набор номера определенное количество раз, установленное в соответствующем свойстве, с выводом результата набора).

- Установка соединения модемом, после набора номера вручную.

- Передача данных между приложениями через DualUp-соединение или нуль-модем (текст, файлы, буфер, команды).

- Параллельная передача данных. К примеру, одновременно можно передавать текст и файл.

- Одновременная передача данных в обе стороны. К примеру, с одной стороны приложение передает файл, а с другой текст или тоже файл.

 

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

реализованы обмен текстом, файлами, причем это можно делать параллельно и одновременно. Также у клиентского приложения есть возможность получать структуру каталогов сервера, выбирать файл и закачивать его.

 

Компонент FreeWare. Дистрибутив в присоединенном файле. Жду критики, советов, замечаний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компонент хорошо установился в Delphi6.

Проверил прием/передачу на заглушку порта(контакт 2 ->3).

Открывается,закрывается порт нормально.

В подобных компонентах есть событие по приему определенного

пакета.Например ~xxxxxxx}.В этом я не нашел.Понимаю,что все

было направлено на работу с модемом и большим обьемом данных,

но COM-порт используется и для управления процессами.А там,

лучше пропустить одну посылку,чем принять неправильную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения:

- удалены несколько выявившихся багов;

- добавлен дополнительный метод чтения при работе с COM-портом;

- добавлены 2 примера, демонстрирующие работу с COM-портом и модемом.

Новая версия в присоединенном файле. Старую версию убрал.

 

Ком порт, да ещё и на дельфи?

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

 

Хотя слова "является не визуальным компонентом на базе класса TComponent"

согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное.

Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вышла новая версия компонента KlientServComConnect. В ней появились кое-какие изменения:

- удалены несколько выявившихся багов;

- добавлен дополнительный метод чтения при работе с COM-портом;

- добавлены 2 примера, демонстрирующие работу с COM-портом и модемом.

Новая версия в присоединенном файле. Старую версию убрал.

 

Ком порт, да ещё и на дельфи?

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

 

Хотя слова "является не визуальным компонентом на базе класса TComponent"

согрели мне душу. Сам весь прошлый год таку штуку, только на Билдере под Кипарис cy7c68013 стряпал. Скажу - занятие это бесконечное и не прибыльное.

Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?

 

Что на Delphi, что на VC++ одинаково.Все используют API-функции Windows.

На Delphi проще.Майкрософт монополизировала написание драйверов , но это

не на долго.Уже много функций переписано под Delphi.И вообще в Windows

лезть нечего.Вы как "железячник" понимаете , что глупо писать специальный

драйвер для приема последовательности импульсов портом компьютера.Это

проще выполнить с помощью контроллера,а его связать по Com-порту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Вы скачали последнюю версию (ту которая сейчас доступна), то после установки компонента, в каталоге установки сможете найти пример работы с 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-порт используется и для управления процессами.А там,

лучше пропустить одну посылку,чем принять неправильную.

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

 

:)

ЗЫ Нахожусь на работе, приду домой могу сбросить на мыло рег.номер (если нужно). :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все методы и события просмотрел внимательно.Ну на серьезный

тест нет времени.То о чем я говорил есть в компонентах APRO

фирмы TurboPower.Очень удобная штука.Очень разгружает

программиста при контроле посылок.Там можно ставить и маски.

Думаю это усилит ваш компонент.Успехов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?

Детектирование портов делаю при помощи ф-ции API EnumPorts...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, детектирование имеющихся портов как делаешь? Можешь вывести список виртуальных портов с драйверами от определённого производителя?

Детектирование портов делаю при помощи ф-ции API EnumPorts...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ком порт, да ещё и на дельфи?

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

По поводу VC++ или какого другого языка: каждый охотник хвалит свое ружье :)

А вообще планирую с компаньеном написать тоже самое для билдера...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Детектирование портов делаю при помощи ф-ции API EnumPorts...

 

А я классом функций SetupDiGetClassDevs всё детектирую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ключ получил.Большое спасибо.Постараюсь оказать

посильную помощь в тестировании компонента.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Детектирование портов делаю при помощи ф-ции API EnumPorts...

Чёт, может я чёто не так делаю...

Всё время на любой тачке, EnumPorts вот такой список выдаёт:

MSFAX:

Факсовый порт

COM1:

Локальный порт

COM2:

Локальный порт

COM3:

Локальный порт

COM4:

Локальный порт

FILE:

Локальный порт

LPT1:

Локальный порт

LPT2:

Локальный порт

LPT3:

Локальный порт

:

Локальный порт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Детектирование портов делаю при помощи ф-ции API EnumPorts...

Все верно. Функция возвращает список всех возможных портов в системе.

Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все верно. Функция возвращает список всех возможных портов в системе.

Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта.

 

Грустна. Значит будем продолжать и дальше пользовать SetupDiGet...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Детектирование портов делаю при помощи ф-ции API EnumPorts...

Все верно. Функция возвращает список всех возможных портов в системе.

Я не совсем корректно ответил в предыдущем посте. Компонент не делает детектирования портов как такового, он выдает список всех возможных сом-портов, а пользователь сам выбирает порт. Детектирование производится в процессе открытия порта.

 

Вот те вариант по проще, из моей компаненты для 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...