Извиняюсь заранее за об'ем, но так наверно понятнее будет почему я хочу получить доступ к анализу данных из порта.
Есть простой файл с координатами, структура строки X2.54Y10.16
для примера 3 строки.
читаем, строим команды для моторХ и моторY, отправляем на контроллер проверяем ответ.
Если есть ответ значит есть связь, значит можно отправлять запрос на окончание отработки команды. Ситуация стандартная.
Вот как это пытался реализовать (на получении доступа к ответу из порта застрял )
Код:
procedure TForm1.Button6Click(Sender: TObject);
var
i,k,z :integer;
motorX :string;
motorY :string;
memstr :string;
begin
if form1.OpenDialog1.Execute then Memo3.Lines.LoadFromFile(OpenDialog1.FileName);
i:=Memo3.Lines.Count;
while i >= 0 do
begin
if (copy(Memo3.Lines.Strings[i],1,1) <>'X') then Memo3.Lines.Delete(i);
i:=i-1;
end;
//-------------------------------------файл загрузили в мемо3
k:=0;
while(k <= Memo3.Lines.Count-1) do // цикл по записям(всего 3 строки по 2е координаты
// структура строки X2.54Y7.62)
begin
memstr := Memo3.Lines.Strings[k];
i:=2;
while memstr[i]<>'Y' do //собираем в tmpstr координату Х
begin
if memstr[i]<>'.'then motorX := motorX+memstr[i]; //игнорим разделитель х100
inc(i);
end;
inc(i);
while i<= length(memstr) do //собираем в tmpstr координату Y
begin
if memstr[i]<>'.'then motorY := motorY+memstr[i]; //игнорим разделитель х100
inc(i);
end;
//-------------------------------------------------------
// точки вытащили далее отправляем команды
// ststX:='NO'; //глобальный флаг состояния мотора X
// ststY:='NO'; //глобальный флаг состояния мотора Y
// Memo1.Lines.Clear; // чистим мемо
// Memo2.Lines.Clear;
motorY := 'ATS=Y'+motorY; //собираем команду для X
WriteComm(motorY); // отправляем на двигатель
sleep(100); //это очень много но для отладки норм
motorX := 'ATS=X'+motorX; //собираем команду для Y
WriteComm(motorX); // отправляем на двигатель
sleep(100); //это очень много но для отладки норм
// в контроллере код написан так, что ответка формируется сразу при приёме команды
// т.е время отклика небольшое менее ~10мс
// Т.О. в этот момент должен дважды прийти ответ и отработать TForm1.Memo1Change.
// если я правильно понимаю то должно быть 6 вызавов TForm1.Memo1Change из 3х строк
if((ststX='OK')and(ststY='OK'))then
begin
Form1.Caption:= IntToStr(k)+' OK';
sleep(1000); // это что бы понять где мы
//сдесь планировалось послать запрос на окончание отработки команды
//проанализировать окончание и перейти к след. строке
inc(k);
end
else
begin
Form1.Caption:= IntToStr(k)+' No';
sleep(1000); // это что бы понять где мы
inc(k); //пока переход на след строку, нодолжен быть обработчик ошибки
end;
end;
end;
procedure TForm1.Memo1Change(Sender: TObject);
var
j :integer;
begin
Memo2.Lines.Text := Memo1.Lines.Text;
for j:=0 to Memo2.Lines.Count-1 do
begin
if pos('ATSXOK',Memo2.Lines.Strings[j])>0 then ststX:='OK' else ststX:='NO';
if pos('ATSYOK',Memo2.Lines.Strings[j])>0 then ststY:='OK' else ststY:='NO';
end;
inc(nn);
Form1.Caption:= Form1.Caption + ' '+ IntToStr(nn); //считаем сколько раз отработало
end;
после выполнения в caption метки о трёх проходах, о трех вызовах Memo1Change и не одного успешного отклика.