Odczyt danych przez port COM

0

Potrzebuję odczytać dane z urządzenia pomiarowego - jest to waga dla samochodów ciężarowych. Wysyłam co sekundę polecenie przez port COM:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  c: integer;
  str: string;
begin
  ComPort.WriteStr('<RN1>');
  c := Memo1.Lines.Count - 1;
  str := Memo1.Lines[c] + #13#10;
  WyslijDane(str);
  Memo1.Clear;
end;

W Memo dostaję odpowiedź taką:

<000011.10.1703:1021561       0       0       39540kg     1   32559>

Jak dobrać się do tych kilogramów? Używam komponentu ComPort 4.1. Próbowałem obrabiać to jako string - usuwałem niepotrzebne wartości z łańcucha, ale bez skutku - wyrzuca jakieś śmieci. Jak to zrobić?

W dokumentacji mam opis jak zbudowana jest odpowiedź z urządzenia:

[ < ] [ Kod błędu ] [ Dane ] [ > ] [ CR ] [ LF ]

Proszę o pomoc.

1

no przecież dostajesz otwartym tekstem wagę więc gdzie masz problem? Policzyć znaki, wyciąć tylko 39540kg, potem wywalić jednostkę i spacje i masz masę

0

Policzyłem, dane wysyłam do skryptu PHP na serwer. Coś się dzieje, że dostaje w ogóle jakieś inne wartości - losowe. Pobiera jakieś śmieci z Memo, czy coś w tym stylu.

0

no ale to co mam ci wywróżyć co nie działa? Może tak jakiś kod byś pokazał

1

Tak poza konkursem napiszę, że korzystnie z jakiejkolwiek kontrolki wizualnej jako pojemnika do przechowywania danych jest bez sensu. Komponenty te służą do wyświetlania danych a nie ich przechowywania.

0

Jaki to gokładnie model wagi ? Po ramce danych wygląda że zapis pomiaru jest staływystarczy copy...

2

Nie copy bo nie wiadomo ile jest liczb ale jeżeli zawsze mamy w kg to może być pętla:

var
  sData: string;
  sWeight: string;
  i: Integer;
begin
  sData:= '<000011.10.1703:1021561       0       0       39540kg     1   32559>';
  i:= Pos('kg', sData) - 1;
  sWeight:= '';
  while sData[i] in ['0'..'9', ','] do
  begin
    sWeight:=  sData[i] + sWeight;
    Dec(i);
  end;
  ShowMessage(sWeight);
end;
0

lub jeśli rozmiar ramki jest stały

var
  sData: string;
  sWeight: string;
begin
  sData:= '<000011.10.1703:1021561       0       0       39540kg     1   32559>';
  sWeight:= Copy(sData,46,6);
  ShowMessage(sWeight);
end;
0
var
  sData: string;
  sWeight: string;
begin
  sData:= '<000011.10.1703:1021561       0       0           1kg     1   32559>';
  sWeight:= Copy(sData,46,6);
  ShowMessage(sWeight);
end;
0

Proponuje zajrzeć do dokumetacji wagi i opisu komunikacji
bo tak w ciemno to trudno powiedzieć jak to zrobić podział , czy zawsze ta sama pozycja czy lepiej separator.

0

to jest stały ciąg, tzn. zawsze netto jest od pozycji a do b, brutto od c do d, tara od e do f, jednostka od g do h, itd. Dodatkowo na początku ciągu może być znak - natomiast puste miejsca uzupełniane są spacją. Nie pamiętam z której wagi jest to protokół ale po komendzie <RN1> coś mi się kojarzy, że kiedyś miałem z nim do czynienia i tam nie ma żadnej magii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1