Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ComDrv32
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
impuls-v
Кто работал с модулем для Delphi ComDrv32 (ComportDriver) v2.16 или ниже откликнитесь очень нужна помошь по раьоте с ним.
Dr.NoA
Не знаю какая у меня версия компонента, но написано, что для Delphi 4.0. Если годится, то могу чем-нибудь помочь.
impuls-v
У тебя версия 2.1 это то что мне нужно. Сам файл должен называтся CPDrv.pas, если да то это точно то.
Если не жалко пожалуйста вышли пару примеров на impuls-v(гав-гав)yandex.ru, буду очень благодарен.
Пока интересуют следующие вопросы:
1) функция ReadData
пишу так
var
pkDir: pchar;
size: Dword; или cardinal
begin
........
ComportDriver1.ReadData(pkDir; size);
дает ошибку Not enough acual parametrs.
Объясни что делаю не так и как надо.

2)Как сделать так чтобы программа запускалась по заполнению буфера InBuf, там есть метод FlushBuffers, но он дает опустошение буфера, если я правильно понял.
dronT78
Цитата
ComportDriver1.ReadData(pkDir; size)

Параметры перечисляются через "," а не ";"
Dr.NoA
Пример функции, читающей Size байт из порта:
Код
  
  function ReadBytes(const Value: Pointer; Size: cardinal): boolean;
  begin
    Result := (ComPort.ReadData(PChar(Value), Size) = Size);
    if not(Result) then
    begin
      MessageDlg(sDeviceNoResponseError, mtError, [mbOk], 0);
    end;
  end;


Ее использование:
Код
var
  GroupName: array[0..IP_GROUP_NAME_LENGTH-1] of byte;
...
  if ReadBytes(@GroupName, IP_GROUP_NAME_LENGTH) then
  ...


Буфером никогда не пользовался, но думаю, что нужно просто сделать обработчик события OnReceivePacket. Скорее всего обработчик будет аналогичен обработчику события OnReceiveData. Пример вот:
Код
procedure TfrmMain.ComPortReceiveData(Sender: TObject; DataPtr: Pointer; DataSize: Cardinal);
var
  Str: string;
begin
  Str := StringOfChar(' ', DataSize);
  Move(DataPtr^, PChar(Str)^, DataSize);
end;

Теперь Str содержит строку длиной DataSize байт.
impuls-v
спасибо, дальше сам буду разбераться.
beginer
А кто-нибудь знает как с помощью этого компонента можно передать в СОМ-порт не символ, а число в двоичной форме? Т. е. если у меня в edit'e записано 11001111, то могу ли я передать это число ввиде одного байта? Или передавать только как 8 байт (т. е. каждый бит как символ)?
Kolia
Цитата(beginer @ Apr 21 2007, 00:11) *
А кто-нибудь знает как с помощью этого компонента можно передать в СОМ-порт не символ, а число в двоичной форме? Т. е. если у меня в edit'e записано 11001111, то могу ли я передать это число ввиде одного байта? Или передавать только как 8 байт (т. е. каждый бит как символ)?

Преобразуйте bin к hex(char) и передавайте 1 байт blink.gif
beginer
Kolia
А если мне надо передать число 201? Это же 1 байт. А если я его преобразую в hex, то передавать придётся 2 байта (символ 'С' и символ '9'). Так что это немного не то (у меня число байт в пакете установлено строго и я не могу передать пакет с большим или меньшим числом байт).

Всем
Хотя я уже вроде понял как через WinAPI-функции передавать числа в СОМ-порт, но всё-таки, может у кого есть исходник программы с этим компонентом, где данные в порт передаются непосредственно ввиде чисел (а не ввиде символов). Был бы вам весьма признателен.
Kolia
Цитата(beginer @ Apr 24 2007, 01:53) *
Хотя я уже вроде понял как через WinAPI-функции передавать числа в СОМ-порт, но всё-таки, может у кого есть исходник программы с этим компонентом, где данные в порт передаются непосредственно ввиде чисел (а не ввиде символов).


Все в этом мире относительно. Для кого-то числа являются символами ('a'==97), а для кого-то наоборот символы - числами (97=='a'). В hex виде 'a'==0x61 в bin 'a'==0b11000001. (*Учебник по информатике начальных классов)
beginer
Я понял о чём Вы говорите. Можно было бы передавать числа ввиде символов, коды которых равны этим числам. Была такая идея. Отказался. Нерационально, имхо. К тому же возникла проблема с передачей символа, код которого равен нулю.
P. S. chr(0) не возвращает никакого символа.
Kolia
Цитата(beginer @ Apr 24 2007, 17:03) *
Я понял о чём Вы говорите.


Сомневаюсь.

В библиотеке ComDrv32 есть функция function TCommPortDriver.SendDataEx( DataPtr: pchar; DataSize, Timeout: DWORD ): DWORD; и function TCommPortDriver.SendChar( Value: char ): boolean; - думаю то что нужно.
beginer
function TCommPortDriver.SendDataEx( DataPtr: pchar; DataSize, Timeout: DWORD ): DWORD;
Да, похоже это действительно какраз то, что мне надо. Только не могли бы Вы написать (если я Вам ещё ненадоел своими распросами) что именно нужно указывать в качестве параметра DataPtr: pchar?
Ну а за пример использования данной функции (с передачей в буфер именно числа), моей благодарности не будет конца.
Kolia
Цитата(beginer @ Apr 26 2007, 05:04) *
что именно нужно указывать в качестве параметра DataPtr: pchar?


DataPtr: pchar - указатель на массив char.

// Пример
Код
union{
    char mas[10];
    int   par[5];
}Send;
TCommPortDriver ComDr;

Send.par[0]=5;   //.....
ComDr.SendDataEx(Send.mas,10,1);


Смотрите исходники.
beginer
О, спасибо! Попозже будем разбираться капитально с этим компонентом. А сейчас надо попробовать API-функции "добить"...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.