ComPort zu langsam!
-
Shit...will nicht so wie ich!
Zuerst erstelle ich eine Datei:FileCreate("Messdaten.txt");und öffne den ComPort:
ComPort1->Open();. Dann sende ich eine Startsequenz
a=0xAA; ComPort1->Write(&a,1);.
Nun sendet die Gegenstelle Daten, die ich in meiner Datei "Messdaten.txt" speichern will. Dazu folgende Ereignisprozedur für OnRxChar:char a; ComPort1->Read(&a, Count); AnsiString s = ""; for(int i=0; i<Count; i++) { AppendStr(s,a); AppendStr(s,"\r\n"); } FileSeek(b,0,2); FileWrite(b, s.c_str(), s.Length()); FileClose();Leider ist die Datei hinterher leer und außerdem möchte ich die Werte als dezimal Zahlen abspeichern. Danke für Tipps.
P.S. Verwende jetzt FileCreate etc., weil LoadList->Add zu lange dauerte.
-
erlich gesagt, habe ich das gefühl du machst dich etwas schwer und suchst an der falschen stelle.
Versuch doch mal mein Beispiel (ungetestet, da ich keinen BCB zur hand habe) nach zu vollziehen und zu komentieren.aber wie gesagt, muss nicht fehlerfrei sein
char* cpInputBuf = new char[Count]; ComPort1->Read(cpInputBuf, Count); /* AnsiString asBuf; for(int x = 0; iCounter < Count; x++) { asBuf = asBuf + IntToStr((int)cpInputBuf[x]); } ListBox1->Items->Add(asBuf);*/ ListBox1->Items->Add(cpInputBuf); delete[] InputBuf; // vor dem Schliessen der Schnittstelle/Applikation ListBox1->Items->SaveToFile("meine Daten.log");mfg
BigNeal
-
Danke für die schnelle Antwort!
Noch eine kurze Frage: Wie kann ich den Char in einen Int umwandeln, damit ich nicht diese Hyroglyphen "àÿ' ÿ' ÿE’" bekomme sondern schöne Zahlen?
-
siehe mein Beitrag:
IntToStr((int)cpInputBuf[x]);ein char hat die grösse von 1 Byte.
das heisst es kann den wert von 0 - 255 haben.
die entsprechenden werten von Buchstaben und sonderzeichen kannst du einer ASCII-Tabelle entnehmen
zB entspricht der Buchstabe A = dem Wert 65 Dezimal oder 41 hex (0x41)char cBuchstabe; cBuchstabe = 'A'; ShowMessage(cBuchstabe); // gibt "A" aus(ohne ""); cBuchstabe = 0x41; ShowMessage(cBuchstabe); // gibt "A" aus(ohne ""); int i = (int)cBuchstabe; // mit (int) sagst du, dass cBuchstabe als int angeschaut werden soll (casten) (das sollte aber mit vorsicht gemacht werden!) ShowMessage(IntToStr(i)); // gibt "65" aus(ohne ""); oder direkt: ShowMessage(IntToStr((int)cBuchstabe));nimm doch mal die "/" und "/" in meinem Beispiel von vorhin raus und du wirst sehen wie es funktioniert
ich hoffe ich habe es einigermassen erklährt
mfg
BigNeal
-
Danke für die kleine Nachhilfestunde! Das Programm läuft...nur leider reicht es nicht für meine Anwendung!

ES IST ZU LANGSAM.
Wenn ich einzelne Bytes empfange läuft alles bestens. Er empfängt sie, zeigt sie im List Fenster an und Speichert sie in der Datei. Doch sende ich viele Daten schnell nacheinander, läuft nix mehr. Der Buffer läuft über und die Daten werden nicht schnell genug ausgelesen und gespeichert!

Ich sende 231 Byte alle 1,69ms. Das sollte doch eigentlich zu empfangen sein, oder? Gibt es Tipps?? Danke!
-
TobiasP schrieb:
Ich sende 231 Byte alle 1,69ms. Das sollte doch eigentlich zu empfangen sein, oder? Gibt es Tipps?? Danke!
das sollte locker zu empfangen sein. normale geschwindigkeit 9600 baud (baud = bit/s)
wenn das zu langsam ist, sehe ich nur fehlerquellen in 2 orten.
1. entweder werden die daten einfach nicht richtig abgeholt
2. oder die datenverarbeitung ist zu langsamalso mit dem von mir geschriebenem code mit der listbox sehe ich eigentlich keine Geschwindigkeitsprobleme.
-
Leider läuft das ganze nicht...weder mit meinem noch mit deinem Code.
Kommt es denn darauf an in welchen Packetgrößen ich die Daten sende? Sprich, lohnt ein Versuch mehr Daten auf einmal zu senden und damit zwischen den einzelnen Datenpacketen mehr Zeit zu haben!?
Ich finde die Sache sehr merkwürdig! ...
-
Was mir gerade noch in den sinn kommt
Da du ja das Erreignis OnRxChar benützt, wird das ja eigentlich 231mal pro 1.69 sekunden aufgerufen.das könnte das problem sein, wenn man es direkt in eine Datei oder in eine Graphische komponente zwischenspeichern will.
versuch mal
private: AnsiString asReadBuf; OnRxChar(TObject *Sender, int Count) { char* cpInputBuf = new char[Count]; ComPort1->Read(cpInputBuf, Count); asReadBuf = asReadBuf + AnsiString(cpInputBuf); delete[] InputBuf; if(asReadBuf.Length() >= 231) { AnsiString asOut; for(int x = 1; x <= asReadBuf.Length(); x++) { asOut = asOut + IntToStr((int)asReadBuf[x]); } ListBox1->Items->Add(asOut); asReadBuf = ""; } }mfg
BigNeal[edit] Rechtschreibung..
-
Super Einfall!!!!
Immerhin blockiert jetzt nicht mehr alles. Jedoch erkenne ich meine gesendeten Zahlen bei den empfangen kaum wieder. Es tauchen nun negative Zahlen auf und alle Nullen scheinen weg zu sein... Was kann da denn schon wieder falsch sein?
-
Hier ist die Fortsetzung des Themas Binäre Daten interpretieren