Announcement

Collapse
No announcement yet.

TComPort

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TComPort

    Hallo, ich nutze oben genannte ComPort Komponente. Ich lese Daten des ComPortes in folgender Form aus:

    void __fastcall TForm1::ComPort1Rx80Full(TObject *Sender)
    {
    char* cpInputBuf = new char [819];
    ComPort1->Read(cpInputBuf, 819);
    asReadBuf = asReadBuf + AnsiString(cpInputBuf);
    delete[] cpInputBuf;
    if(asReadBuf.Length() >= 2457)
    {
    AnsiString asOut;
    for(int x=1; x<= asReadBuf.Length(); x++)
    {
    if (x==1) {
    asOut = IntToStr((int)(unsigned char)asReadBuf[x]);
    }
    else {
    asOut = asOut + "\r\n" + IntToStr((int)(unsigned char)asReadBuf[x]);
    }
    }
    ListBox1->Items->Add(asOut);
    ListBox1->Items->SaveToFile("Daten.txt");
    asReadBuf = "";
    }

    }

    IN WORTEN: Wenn der Empfangspuffer zu 80% gefüllt ist, werden 819 Byte (etwa 80% von 1024byte) ausgelesen. Wenn der Ansistring asReadBuf (definiert als private) eine Länge von mindestens 2457 erreicht hat, wird in die ListBox geschrieben und gespeichert.
    Problem ist jetzt, ich kann keine Nullen empfangen...liegt wohl an "char"...aber mit "unsigned char" bekomme ich das nicht hin! :-( ...außerdem bekomme ich alle 819 Byte (also genau die größe der Eingelesenen Byte pro OnRx80Full) Fehler. Es schleichen sich Zahlengruppen wie {49, 60, 51, 147} ein...zusätzlich zu den richtigen Messwerten - es geht also nichts verlohren, sondern es kommt "Quatsch" hinzu! Es wird also wohl zu viel aus einem Speicher gelesen, aber wo??
    Danke für Tipps!

  • #2
    cpInputBuf 3 Zeilen später falsch deletet. Warum als Array?

    cpInputbuf wäre zur vorsicht mit memset auf 0 zu setzen.

    Ein Zeiger auf char* der hier als Container für alle möglichen Zeichen genutzt wird, sollte nicht in String (AnsiString) umgewandelt werden, ausgenommen du bist wirklich sicher es sind keine nichtdruckbaren Zeichen drin.

    Ein 0x00 ist für char übrigens das Ende-Zeichen

    Warum dieses if Konstrukt?

    asOut = IntToStr((int)(unsigned char)asReadBuf[x])+"\r\n";

    Dann lieber die letzte Zeile in der Listbox löschen, als x-Prüfungen in der Schleife, die ohnehin nur 1 x zutrifft.

    "Es schleichen sich Zahlengruppen wie {49, 60, 51, 147} "
    Aha, das sagt außer dir eigentlich keinem was!

    Zu dem Rest kann man nicht viel sagen, da keiner deine Daten kennt. Empfehle da mal debuggen

    Alternativ stehen im C++Builder so nette Befehle wie SysGetMem zur Verfügung
    Christian

    Comment

    Working...
    X