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?
-
Hallo
schau dir dochmal die Dokumentation zu deiner Komponente genau an
da steht sicher drin was du aendern musstDa 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ß
EddieBeispiel 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; } }