2017-01-06 9 views
-1

У меня есть проблема с доступом к моему серийному порту в Delphi при использовании компонента TComPort. Он не может передавать данные полностью, но некоторые данные будут потеряны случайно, как в этом примере:Последовательный порт в Delphi 7 с ComPort не отправляет данные полностью

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: 1 096: -152: 16616
061: 1 096: -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: тысячу сто семьдесят-два: -264: 16560: -436: 257: -72: 0.000000:
061: 1196: -200: 16724: -428: 234: -78: 0,000000 0,000000: 0,0056

правильные данные должен содержать 10 значений, как показано ниже:

061: 1196: -200: 16724: -428: 234: -78: 0,000000 0,000000: 0,0056

Пожалуйста, помогите мне решить эту проблему. Я новичок в Delphi.

Это мой код:

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

Мы не можем помочь вам с этим кодом, взятым из контекста. Либо задайте лучший вопрос (см. Статьи в [help]), либо выполните некоторую отладку. –

+1

Вы используете метод обмена пакетами, когда библиотека обеспечивает целостность пакета данных, если маркеры/часовые настройки установлены правильно. Но почему вы снова проверяете маркеры 'if (Pos (# $ A, allData)> 0)'? Запишите все данные без обработки и проверьте, потеряны ли некоторые байты или нет. – MBo

+1

Я предполагаю, что ваш список данных берется из Memo1, и в этом случае проблема в том, что данные отсутствуют в Str - i.e проблема в другом месте. Нет смысла показывать этот код, если он явно не содержит вашей проблемы. – Dsm

ответ

0

Я не вижу, как пакетный режим помогает вам. Попробуйте подход без пакетов, сделайте обработчик события OnRXChar. Я предполагаю, что ваши данные содержат маркер конца конца $ A, маркер начала.

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

Спасибо за альтернативу, я попробую –