Работа с устройством ELM327 через СОМ-порт используя BComPort Брусникина И.В

Здравствуйте.

Пишу для себя программу для чтения информации с электронного блока управления двигателем.

Использую адаптер семейства ELM327. В терминальном режиме, например в PuTTY, общение идет без проблем. Я знаю что спрашивать по CAN-шине, знаю формат ответов. Но хочу что бы все это было в отдельной программе, что бы нажал кнопку опроса и получил на экране удобночитаемые цифры показателей. И решил тряхнуть стариной, т.к. давно не программировал. Нашел Delphi 7, нашел пару компонентов для работы с COM-портом, попробовал скомпилировать демки и в итоге начал переделывать демку Terminal из компонента TBComPort Брусникина И.В.

И столкнулся с проблемой чтения строк ответа от адаптера. Сначала я должен инициализировать адаптер, для чего должен послать ему несколько АТ-комманд. Вот они:

ATZ

ATS0

ATSP6

Вот как выглядит обмен в терминальном режиме:

>atz

ELM327 v1.3a

>ats0

OK

>ate0

OK

>atsp6

OK

>atdp

ISO 15765-4

>

После каждой посланной команды, я должен прочесть ответ адаптера и понять что он готов принимать следующую команду, т.е. я жду от него символа ">". Но на чтении программа зависает. Вот код:

DelphiВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

procedure TMainForm.btnConnectClick(Sender: TObject);
var
s:string;
begin
  BComPort1.Port := cbPort.Text;
  BComPort1.BaudRate := TBaudRate(9+cbBaudRate.ItemIndex);
  if BComPort1.Open then
  begin
 
    BComPort1.WriteStr('ATZ'+#13);  //сброс
    repeat BComPort1.ReadStr(buf,count);
          begin
          s:=S+buf;
          end
    until Pos('>',s) <> 0;
    Memo1.Text := Memo1.Text + AdjustLineBreaks(S);
 
    buf:=''; s:='';
    BComPort1.WriteStr('ATS0'+#13); //отключаем печать пробелов
    repeat BComPort1.ReadStr(buf,count);
          begin
          s:=S+buf;
          end
    until Pos('>',s) <> 0;
    Memo1.Text := Memo1.Text + AdjustLineBreaks(S);
 
    buf:='';
    BComPort1.WriteStr('ATSP6'+#13); //задаем протокол КАН и скорость
    repeat BComPort1.ReadStr(buf,count);
    until Pos('>',buf) <> 0;
 
  end;
end;

Прикладываю еще лог Portmona из которого видно что чтение происходит посимвольно и символ ">" считывается, но программа его не видит.

У компонента есть еще событие OnRxChar, но я не знаю как его можно будет полноценно использовать в целом в программе.