Ich habe ein Problem mit dem Zugriff auf meine serielle Schnittstelle in Delphi bei Verwendung der TComPort
Komponente. Es kann nicht die Daten senden voll, aber einige Daten verloren gehen zufällig, wie in diesem Beispiel:Serielle Schnittstelle in Delphi 7 mit ComPort senden die Daten nicht vollständig
061: 1268: -108: 16596: -462: 239: -75: 0,000000 0,000000
061:
061: 1240: -84: 16616: -425: 235: -54: 0,000000: 0.
061: 1220: -96: 16620: -418: 224: -69: 0,000000 0,000000: 0,0055
061: 1220: -72: 16676: -420: 246: -72: 0,0
061: 1100: -176: 16688: -460: 224: -45: 0,000000: 0,000000: 0,0056
061: 1164: -144: 16676: -442: 23
061: 1272: -136: 16456: -413: 219: - 84: 0,000000 0,000000: 0,0056
061: 1096: -152: 16616
061: 1096: -140: 16656: -427: 235: -88: 0,000000 0,000000: 0,0056
061: 1200: -1
061: 1192: -84: 16664: -447: 228: -60: 0,000000: 0,000000: 0,0055
061: 1208: -116: 16576: -421: 233: -56: 0,000000 0,000000
061: 1208: -128: 16584: -427: 226: -94: 0,000000 0,000000: 0,0056
061: 1172: -264: 16560: -436: 257: -72: 0.000000:
061: 1196: -200: 16724: -428: 234: -78: 0,000000 0,000000: 0,0056
die richtigen Daten enthalten soll 10 Werte, wie unten:
061: 1196: -200: 16724: -428: 234: -78: 0,000000 0,000000: 0,0056
Bitte helfen Sie mir, dieses Problem zu lösen. Ich bin ein Anfänger in Delphi.
Dies ist mein Code:
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
begin
allData := allData + Str;
if Pos (#$A, allData) > 0 then
begin
awal := 1;
batas := Pos(':', allData);
Delete(allData, awal, batas);
//Data Gyroscope
awal := 1;
batas := Pos(':', allData);
gyroX := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label2.Caption := gyroX;
awal := 1;
batas := Pos(':', allData);
gyroY := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label3.Caption := gyroY;
awal := 1;
batas := Pos(':', allData);
gyroZ := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label4.Caption := gyroZ;
//Data Accelero
awal := 1;
batas := Pos(':', allData);
accX := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label6.Caption := accX;
awal := 1;
batas := Pos(':', allData);
accY := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label7.Caption := accY;
awal := 1;
batas := Pos(':', allData);
accZ := Copy(allData, awal, batas-1);
Delete(allData, 1, batas);
Label8.Caption := accZ;
//Data GPS
awal := 1;
batas := Pos(':', allData);
Lat := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label10.Caption := Lat;
awal := 1;
batas := Pos(':', allData);
Long := Copy(allData, awal, batas-1);
Delete(allData, awal, batas);
Label11.Caption := Long;
awal := 1;
palingAkhir := Pos(#$A, allData);
Alt := Copy(allData, awal, palingAkhir-1);
Delete(allData, awal, palingAkhir);
Label12.Caption := Alt;
//Showing to Memo
Memo1.Text := Memo1.Text + Str + #$D;
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count);
end
Wir können Ihnen nicht helfen mit diesem Code aus dem Zusammenhang gerissen. Stellen Sie entweder eine bessere Frage (siehe Artikel in der [Hilfe]) oder führen Sie ein Debugging durch. –
Sie verwenden den Paketaustausch-Ansatz, wenn die Bibliothek die Datenpaketintegrität bereitstellt, wenn Markierungen/Sentinels richtig gesetzt sind. Aber warum checkst du wieder nach Markierungen? 'If (Pos (# $ A, allData)> 0)'? Protokollieren Sie alle Daten ohne Behandlung und prüfen Sie, ob einige Bytes verloren gegangen sind oder nicht. – MBo
Ich gehe davon aus, dass Ihre Liste von Daten aus Memo1 stammt, in welchem Fall das Problem darin liegt, dass Daten von Str fehlen - d. H. Das Problem liegt woanders. Es macht keinen Sinn, diesen Code zu zeigen, wenn er Ihr Problem eindeutig nicht enthält. – Dsm