ComPort Library von Dejan Crnila



  • Hallo. Ich verwende die ComPort Library von Dejan Crnila und möchte Daten vom ComPort auslesen. Leider klappt das nicht wie gewünscht. Ich sende von einem anderen PC aus 308 Byte und empfange sie mit einem Terminal-Programm auch problemlos. Leider bekomme ich sie mit BCB nicht vollständig empfangen (am Ende fehlt mal mehr oder weniger).
    Mein Code zum OnRxChar Ereignis sieht so aus:

    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
            unsigned char z;
            for(int i=0; i<Count; i++) {
                    ComPort1->Read(&z,1);
                    Memo1->Lines->Add(a);
            }
    }
    

    Ist das so richtig???
    Weitere Frage: Wird Count von BCB selber bestimmt?

    Danke, Flo



  • Ich denke "Count" ist der Schlüssel zum Geheimnis. Es gibt an, wieviele Bytes empfangen werden. Doch Count wird ein Wert während der Laufzeit (z.B. 279) zugewiesen. Damit werden 279 Bytes empfangen...doch leider nicht die 308! Stelle ich Count auf 308 scheint es zu gehen...doch möchte ich flexibel in der Anzahl empfangener Bytes sein und dies nicht vorher im Code festlegen müssen! HILFE!!! ...danke.



  • Also Count scheint anzugeben, wieviele Bytes im Buffer eingegangen sind! Doch warum sind da nicht alle die, die ich gesendet habe?? Ein Null-Acht-Fünfzehn Terminalprogramm empfängt alles und BCB nicht...wo gibts denn so was?


  • Mod

    Hallo

    schau dir dochmal die Dokumentation zu deiner Komponente genau an
    da steht sicher drin was du aendern musst

    Da ich deine Komponente nicht kenne kann ich dazu nicht viel sagen
    Nur eines - das hat mit dem BCB gar nichts zutun - das ist entweder ein Fehler
    in der Komponente oder ein Progammierfehler (Einstellungen zB)

    Mfg
    Klaus



  • hatte n ähnliches Problem bei UDP Packets,
    mach mal die "/0" String terminator raus, eventuell liegts daran das du nur ein Stückchen anzeigen kannst.



  • Hi,
    habe vor einem Jahr im Zuge einer Projektarbeit auch damit gearbeitet. Habe mal das Programm rausgekramt. Eventuell hilft dir das weiter. Habe noch ein paar mehr Beispiele, allerdings überblicke ich das Programm nicht mehr so ganz. Habe mich seit einem Jahr nicht mehr damit beschäftigt. Mensch was man nach so einer langen Zeit alles vergisst 😮

    Aber ich glaube die for Schleife kannst du dir sparen. Hier mal zwei Beispiele aus meinem Programm. Habe jetzt nicht Editiert, such dir das passende raus.

    Gruß
    Eddie

    Beispiel 1

    void __fastcall Tfrm_com_ansteuerung::ComPort3RxChar(TObject *Sender, int Count)
    {
        //Daten einlesen und ausgeben
    
        AnsiString Str3,daten_com3;
        ComPort3->ReadStr(Str3, Count);
        daten_com3=daten_com3+Str3;
        memo_com3->Lines->Text=daten_com3;
    
    }
    

    Beispiel 2

    void __fastcall Tfrm_com_ansteuerung::ComPort6RxChar(TObject *Sender, int Count)
    {
         AnsiString varWT,WTnr,varWTREPLACE,Str6;
         static AnsiString daten_com6="";
    
         ComPort6->ReadStr(Str6, Count); //Empfange String vom ComPort
    
         daten_com6=daten_com6+Str6;
    
        try
        {
         int pos=daten_com6.Pos("\n");  //Im String nach "CR" und "LF" suchen
         if (pos>0)
         {
    
         AnsiString ok="0    \n",nio="1    \n";
         int  laenge = daten_com6.Length();  //Stringlänge einen Integer zuweisen.
    
             if(laenge==396)             //Überprüfe Zeichenlänge
            {
             ComPort6->WriteStr(ok);     //Sende alles i.o.
            }
            else {ComPort6->WriteStr(nio); daten_com6="";}  //Sende n.i.o.
    
         varWT=daten_com6.SubString(11,5);
         //Zeichen Isolieren um Textnamen zu erzeugen
         varWTREPLACE = StringReplace(varWT, " ", "", TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
         //Lehrzeichen im isoliertem String löschen
         memo_com6->Lines->Text=daten_com6.SubString(1,pos);
         //Schreibe kompletten String ins Memo
         frmBenutzeroberflaeche->memuebergabe->Lines->Text=memo_com6->Lines->Text;
         //Textübergabe an Benutzermemo zur trennung IO und NIO Daten
         daten_com6=daten_com6.SubString(pos+1,daten_com6.Length());
         //Ersten String sichern, falls nächster Sring schon im Buffer
         memo_com6->Lines->SaveToFile("messdaten\\WT" +varWTREPLACE+".txt");
         //String in Textdatei speichern, Dateinamen erzeugen
         }
        }
        catch (Exception& e)                      //Fehlermeldung abfangen
        {
            String className = e.ClassName();
            String msg = e.Message;
        }
    }
    

Anmelden zum Antworten