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

Если запрос сформировать так:
Код:
procedure TMain.Read;
 begin
 ReplyLen:=255;
 ReplyBuffer:=GetMem(ReplyLen);
 Ret := W_IO(#$1, #$00, 0, '', ReplyLen, ReplyBuffer);
if Ret = REPLY_OK then begin
 Edit1.Text:='Команда выполнена успешно, получены данные';
 Edit2.Text:=PChar(ReplyBuffer);
end;
 FreeMem(ReplyBuffer);
 end;
то компилятор ругается на
Код:
 ReplyBuffer:=GetMem(ReplyLen);
[Error] Main_form.pas(138): Incompatible types

Если сделать таким образом:
Код:
procedure TMain.Read;
 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;
То все компилируется, но вылетает ошибка и в Edit2 ничего не вписывает.
Что я опять сделал не так?



Привел запрос к следующму виду
Код:
procedure TMain.Read;
 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(GetMemory(ReplyLen));
end;
 //FreeMemory(ReplyBuffer);
  end;
И теперь в Edit2 вписывает - "-6E"
Если езменить ReplyLen:=25;, то вписывает - "TK•", но это не то, что мне необходимо вывести.
В Edit2 должно выводиться примерно следующее - "31 33 20 4D 48 7A 20 52 65 61 64 65 72"

При включении FreeMemory(ReplyBuffer);, программа при первом же запросе падает в ошибку, а при отключении при втором.

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

При выполнении запроса в цикле ошибка не выскакивает, программа ререстает отвечать, хотя со считывателем общается.
Код:
procedure TMain.Read;
 begin
 repeat
 ReplyLen:=25;
 ReplyBuffer:=GetMemory(ReplyLen);
 Ret := W_IO(#$1, #$00, 0, '', ReplyLen, ReplyBuffer);
if Ret = REPLY_OK then
 Edit1.Text:='Команда выполнена успешно, получены данные';
 Edit2.Text:=PChar(GetMemory(ReplyLen));
 until Ret = REPLY_ACK; // выход из цикла чтения при ошибке
 end;
Изображения
Тип файла: jpg error.JPG (10.5 Кбайт, 6 просмотров)
Ответить с цитированием