1

サンプル デモ プログラムを使用して、GPS から NMEA データを取得しようとしています。Aysnc Pro - バージョン 5 ( TApdComPort)コンポーネントで Delphi を使用しています。イベントを使用OnTriggerAvailして NMEA 文字列をキャプチャしました。GPSユニットが異なるデータ数を供給していることがわかりました。ほとんどの場合、一度に 1 つの ASCII 文字をフィードします。バッファー文字列を使用してすべてのデータをキャプチャし、必要な NMEA センテンスを入力します。私のデモプログラムではすべて正常に動作します。

しかし問題は、デモ コードをメイン アプリケーションに統合したときに発生します。私のメイン プログラムは、単一の ASCII 文字の受信をうまく処理できないと思います。デバッグ中に、受信データ数 ( Countfrom OnTriggerEvent) が 100 を超える場合、データを入力できることに気付きました。ただし、受信データ カウントが 1 の場合 (この可能性が高い) は入力されません。

ここで私を助けてください:

  • データが単一の ASCII 文字の連続で連続して来る場合、シリアル ポートからデータを受信するためのより良い方法はありますか?
  • デモ プログラムは正常に動作するのに、メイン アプリケーションでは動作しないのはなぜですか?

ここに私のデモコードがあります

procedure TFormMain.btnOpenClick(Sender: TObject);
begin
    Serial_init;
   try
      bufferString := '';
      CarrierOn := false;
      ApdComPort1.Open := True;
      Memo1.Lines.Add('COM port ', IntToStr(ApdComPort1.ComNumber), ' is open');
   except
      on e : EInOutError do
         Memo1.Lines.Add ('Error: ' + e.Message);
   end;
end;

procedure TFormMain.Serial_init;
begin
   ApdComPort1.ComNumber := 4;
   ApdComPort1.Baud := 4800;
   ApdComPort1.DataBits := 8;
   ApdComPort1.Parity := pNone;
   ApdComPort1.StopBits := 1;
end;

const
   NMEA_START = '$';
   NMEA_END_CF = #13;
   NMEA_END_LF = #10;
procedure TFormMain.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
   sError : string;
   c: ansichar;
   i: integer;
   CarrierOn: Boolean;
begin
   for i := 1 to Count do
   begin
      c := ApdComPort1.GetChar;
      if c = NMEA_START then
         CarrierOn := True;
      if CarrierOn then // $ has been found collect the data
      begin
         if (c = NMEA_END_CF) then exit;
         if (c = NMEA_END_LF) then
         begin
            sError := '';
            if (PopulateData(bufferString, sError)) then
            begin
               ApdComPort1.FlushInBuffer;
               CarrierOn := false;
               bufferString := '';
               exit;
            end;
            CarrierOn := false;
            bufferString := '';
         end
         else
         begin
            bufferString := bufferString + c;
         end;
      end;
   end;
end;

function TFormMain.PopulateData(const Sentence: string; out ErrorMessage: string): boolean;
begin
   Result := SentenceDecoder('$GPGSV', Sentence);
   if Result then
      Memo1.Lines.Add('Data:' + Sentence); // Display received GSV data
end;

function TFormMain.SentenceDecoder(sentenceName, Sentence: string): boolean;
begin
   Result := Pos(sentenceName, sentence) = 1;
end;

前もって感謝します

4

0 に答える 0