Показать сообщение отдельно
  #8  
Старый 16.10.2012, 03:06
firmwares firmwares вне форума
Прохожий
 
Регистрация: 30.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

Привел обработчик Button2 к следующему виду.
Код:
 // Устанавливаем параметры протакола....
procedure TForm1.Button2Click(Sender: TObject);
var
  Prot: TProtocolInfo;
begin
  Prot.DisableAddress:=true; // Размер структуры, байт
  Prot.CheckMode:=03; // Режим проверки контрольной суммы
  W_SetProtocolParams(@Prot)
end;
Теперь параметрами можно спокойно управлять....

Вопрос по поводу "access violation at address" все еще открыт.
Не могу догнать почему это происходит.

И еще!
Если в запросе поставить
Код:
 Ret := W_IO(#$1, #$00, 0, '', @ReplyLen, ReplyBuffer);
А не
Код:
 Ret := W_IO(#$1, #$00, 0, '', ReplyLen, ReplyBuffer);
То компилятор ругается
[Error] Unit1.pas(120): Types of actual and formal var parameters must be identical


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SyncObjs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    function LinkProc(ProcName: string):Pointer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  PComInfo = ^ TComInfo;
  TComInfo = record
  RecordSize: DWORD; // Размер структуры, байт
  Port: BYTE; // Номер порта. 1 - COM1 и т.д.
  BaudRate: DWORD; // Скорость обмена
  WaitPortTimeout: DWORD; // Время ожидания доступности порта, мс
  ReadTotalTimeout: DWORD; // Время ожидания ответа считывателя, мс
  ReadNextByteTimeout: DWORD; // Время ожидания поступления очередного
                              // байта при условии, что обнаружено начало
                              // валидного кадра, мс.
  end;

  type
  PProtocolInfo = ^ TProtocolInfo;
  TProtocolInfo = record
  DisableAddress: BOOLEAN; // Размер структуры, байт
  CheckMode: INTEGER; // Режим проверки контрольной суммы
  end;
var
  Form1: TForm1;
// набор импортируемых функций
  W_SetPortParams: procedure(PortCfgPtr: PComInfo); stdcall;
  W_SetProtocolParams: procedure(ProtocolInfoPtr: PProtocolInfo); stdcall;
  W_IO: function(Address, Cmd: char;
                 BodyLen: integer;
                 const CmdBody;
                 var ReplyLen: integer;
                 var ReplyBuffer): char; stdcall;
  LibHandle: THandle;

  implementation

  {$R *.dfm}

{ TForm1 }

{ TForm1 }

function TForm1.LinkProc(ProcName: string): Pointer;
begin
  result:= GetProcAddress(LibHandle,PChar(ProcName));
end;

// Подключаем DLL....
procedure TForm1.FormCreate(Sender: TObject);
begin
  LibHandle:= LoadLibrary('dll/ProX232.dll');
  W_SetPortParams:= LinkProc('W_SetPortParams');
  W_SetProtocolParams:= LinkProc('W_SetProtocolParams');
  W_IO:= LinkProc('W_IO');
end;

// Устанавливаем параметры порта и создаем подключение....
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TComInfo;
begin
  t.Port:= 3;
  t.BaudRate:= 115200;
  t.WaitPortTimeout:= 200;
  t.ReadTotalTimeout:= 100;
  t.ReadNextByteTimeout:= 50;
  t.RecordSize:= 21; // dword = 4 байтам
  W_SetPortParams(@t)
 end;

 // Устанавливаем параметры протакола....
procedure TForm1.Button2Click(Sender: TObject);
var
  Prot: TProtocolInfo;
begin
  Prot.DisableAddress:=true; // Размер структуры, байт
  Prot.CheckMode:=03; // Режим проверки контрольной суммы
  W_SetProtocolParams(@Prot)
end;

// Формирем и отправляем запрос....
procedure TForm1.Button3Click(Sender: TObject);
// Описываем константы....
Const
  REPLY_OK = #$0;
  REPLY_ACK = #$55;
var
// Выводим переменные....
  Ret:Char;
  ReplyLen:integer;
  ReplyBuffer:Pointer;
begin
//определяем размер буфера и выделяем под него память....
  ReplyLen:=255;
  ReplyBuffer:=GetMemory(ReplyLen);
// Формируем и отправляем запрос....
  Ret := W_IO(#$1, #$00, 0, '', @ReplyLen, ReplyBuffer);
 if Ret = REPLY_OK then
begin
// Выводим ответ от считывателя...
  Edit1.Text:='Команда выполнена успешно, получены данные';
  Edit2.Text:=PChar(ReplyBuffer);
end;
// Освобождаем память...
  FreeMemory(ReplyBuffer);
end;

end.
Ответить с цитированием