サンプル デモ プログラムを使用して、GPS から NMEA データを取得しようとしています。Aysnc Pro - バージョン 5 ( TApdComPort
)コンポーネントで Delphi を使用しています。イベントを使用OnTriggerAvail
して NMEA 文字列をキャプチャしました。GPSユニットが異なるデータ数を供給していることがわかりました。ほとんどの場合、一度に 1 つの ASCII 文字をフィードします。バッファー文字列を使用してすべてのデータをキャプチャし、必要な NMEA センテンスを入力します。私のデモプログラムではすべて正常に動作します。
しかし問題は、デモ コードをメイン アプリケーションに統合したときに発生します。私のメイン プログラムは、単一の ASCII 文字の受信をうまく処理できないと思います。デバッグ中に、受信データ数 ( Count
from 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;
前もって感謝します