
16.10.2012, 03:06
|
Прохожий
|
|
Регистрация: 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.
|