2017-01-06 2 views
-1

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 
+2

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. –

+1

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

+1

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

Antwort

0

Ich sehe nicht, wie Paket-Modus Ihnen hilft. Versuchen Sie einen Ansatz ohne Pakete, machen Sie OnRXChar Event-Handler. Ich nehme an, dass Ihre Daten das End-Marker-Byte $ A enthalten, keine Startmarkierung.

var 
    Accumulator: AnsiString; 
    List: TStringList; 
... 
//OnCreate 
List:= TStringList.Create; 
List.Delimiter := ':'; 

//OnDestroy 
List.Free; 


procedure XXX.RXChar(Sender: TObject; Count: Integer); 
var 
    s, DataStr: AnsiString; 
    APos: Integer; 
begin 
    ComPort.ReadStr(s, Count); 
    Accumulator := Accumulator + s; 
    APos := Pos (#$A, Accumulator); 
    if APos > 0 then begin 
    DataStr := Copy(Accumulator, 1, APos - 1); 
    Delete(Accumulator, 1, APos); 
    Memo1.Lines.Add(DataStr); 
    List.DelimitedText := DataStr; 
    if List.Count = 10 then 
     TreatListItems; //extract data from List[] 
    end; 
end; 
+0

Danke für die Alternative, ich werde es versuchen –

Verwandte Themen