serialport->... in textbox ausgeben.



  • ich schraube mir gerade ein kleines tool, das mir sensor werte anzeigen soll.
    ich nutze dafür "Microsoft Visual C++ 2008 Express Edition" und habe darin eine
    "CLR -> Windows Forms-Anwendung" angefangen.

    hier ein kleiner ausschnitt in dem wohl ein denkfehler ist.

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    				   serialPort1->Open();
    				   if (serialPort1->IsOpen)
    				   {
    					   for(int a=1;a<254;a++)
    					   {
    					     button2->Enabled = false;
    					     button3->Enabled = true;
    					     textBox1->Text = serialPort1->ReadLine();
    					     progressBar1->Value = a;
    					   }
    				   }
    				   serialPort1->Close();
    		 }
    private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
    			 if (!serialPort1->IsOpen)
    			 {
    				 button2->Enabled = true;
    				 button3->Enabled = false;
    				 progressBar1->Value = 0;
    			 }
    		 }
    

    erstes problem:
    wenn ich button2 anklicke um das lesen von serialPort1 zu starten
    kann ich solange nichts mehr machen bis die for schleife beendet ist.
    button3 soll zum beenden des leseforgangs sein,
    wie ich das hin bekomme weiss ich nicht.

    zweites problem:
    die progressBar1 aktualisiert sich mit jedem durchlauf der for schleife
    aber nicht der inhalt der textBox1:
    ich sehe erst nach ende der for schleife etwas in textBox1.

    drittes problem:
    serialPort1 muß ich in eine variable ablegen um ihren inhalt zerlegen zu können.
    leider bekomme ich die fehlermeldung das serialPort1 einen array wert hat und
    meine char variable diesen nicht aufnehmen kann.
    darum gebe ich serialPort1 aktuell direckt in die textBox1 aus.

    letztes problem:
    über serialPort1 kommt ein wert im format "123,123,123,123" rein.
    wie zerlege ich diesen in 4 einzelne werte?
    das komma ist nur ein trennzeichen.

    ---------edit----------

    ach noch ne frage:
    wie zwinge ich mein tool, als style windows-klassisch zu nutzen?



  • Hoi,

    Im gegensatz zu einem AVR ist die RS232/485 abfrage nicht mehr Interrupt gesteuert, sondern per Polling.
    Man könnte jetzt so rangehen, das man mit einem Timer alle 150ms checked ob etwas buffer ist, das lädt und die Progressbar ändert. Mit den Button startest und Stopst du nur den Timer. Ich würde sogar nur einen Button und eine globale boolsche variable nehmen.

    Zur textbox,.. ich hatte mir ne funktion AppendText geschrieben, lade mit GetWindowText den text aus dem edit window, appende den neuen Text, sofern in der ASCII range xy, und setze den neuen text mit SetWindowText.

    Eine Progressbar macht als solches nur dann sinn wenn Du definitv nur 254 Zeilen lesen willst, ich weiß nicht ob das bei messungen mit nem Tektronix oszi, Gentec etc. wirklich Sinn macht.

    Meistens bauen die Geräte auf ein eigenes Protokoll auf, so dass z.B. STX oder ETX delimitern der Start bzw. das ende gesendet werden oder Du den Geräten mitteilen musst wann diese die Messung Stoppen sollen.

    Ich kenn leider die Datenstrucktur nicht, die SerialPort1->ReadLine() ausgibt, daher kann ich Dir nicht sagen wie man schnell einen Parser aufbauen könnte.

    Grüüße



  • weitere einzelheite zum verständniss:

    ich habe eine PICAXE schaltung welche mir daten an den PC sendet.
    "sertxd (#b6,",",#b3,",",#b4,",",#b5,13,10)" ist der BASIC code im chip.

    der Hyperterminal kann diese werte ohne murren darstellen und auch
    das programm ComTools von Anton Zechner rattert mir die rein kommenden daten
    in einem Komando-fenster runter.
    damit gehe ich davon aus das die rein kommenden daten richtig sind
    nur mein programm nicht so läuft wie es soll.

    ich bekomme von meinem PICAXE daten im format "123,123,123,123"
    alle par milisekunden gesendet.
    der wert ist fest zwischen 0 und 255 und kann diesen nicht überschreiten.
    der erste wert ist nur ein zähler und wird später entfallen.
    die anderen drei werte sind sensor werte von entfernungs sensoren.

    ich möchte mit hilfe von drei progressBar's die sensor werte grafisch darstellen.
    die progressBar's sind auf einen max. wert von 255 eingestellt.

    --------------------

    das mit Timer alle 150ms werde ich mal versuchen.
    da die sensor werte nicht nur von 0 bis 255 laufen und dann ist schluß,
    sondern jederzeit ein stärkerer oder nidrigerer ausschlag der progressBar
    möglich ist, denke ich das meine wahl schon sinn macht.

    ich will mir das nachbalsteln einer grafischen darstellung von balken
    wie in diesem beispiel sparen.

    @zeusosc
    deine funktion AppendText ist zu umfangreich für mich.
    ich muß nicht den alten text von der textBox auslesen sondern nur durch
    die aktuell empfangenen daten ersetzen.
    das ist nur zur kontrolle der eingehenden werte.
    ob die BaudRate richtig ist oder ob nur hieroglyphen an kommen.

    hier noch ein download, des aktuellen Projeckt.



  • Falsches Forum: C++/CLI wäre korrekt.
    Dein Beitrag wird bestimmt bald verschoben.
    Simon



  • Also mit PIC's kenne ich mich net so aus, aber die 13,10 am ende verrät das ein Zeilenende da ist 😃

    Gib mir nochmal bitte den genauen Rückgabedatentyp der ReadLine(), sonst kann ich da keine weiteren Aussagen machen.

    Anstatt der ProgressBar kann man das auch selber zeichnen, ist nicht so aufwändig wie Du denkst.

    Was zu deinem Projekt, ist dies zur Geodäsischen Vermessung oder eher für nen Robo gedacht? Nimmst du IR oder Ultraschall sensoren?

    Grüüße



  • wiso CLI ? ich nutz einerseitz Visual C++ und andererseits ist es doch ein problem wie ich die API (textBox) richtig nutze?
    naja egal.

    genau wegen der 13,10 bin ich der meinung das ich nur zeile für zeile daten bekomme. nicht ein volles array.

    was meinst du mit Rückgabewert von ReadLine() ?
    in der TextBox habe ich z.b. "39,1,6,15" und einen zeilen umsprung den es mir als kleines kästchen enzeigt.

    da ich die progressBar auf "style->Continuous" eingestellt habe, genügt mir die genauigkeit der anzeige wenn ich klassik-style nutze.

    es handelt sich um die werte von drei GP2D12 IR-Sensoren von Sharp.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hoi,

    Also der Rückgabedatentyp ist System.string

    string temp="";
    
    for(...)
    {
    temp=SerialPort1.ReadLine();
    .
    .
    }
    
    int Value_1=_wtoi(temp[1].c_str());
    

    der code ist ungeprüft,...

    grüße



  • danke für die schnelle antwort.
    string 😉 ich habs mit char versucht. 😞
    da muß ich mich nicht wundern.

    noch zwei aktuelle fragen:
    - warum nutzt du wie viele andere immer einen "." an stelle von "->"
    das verursacht bei mir immer fehler beim compailieren.
    - kannst du mir "int Value_1=_wtoi(temp[1].c_str());" näher erklären.
    das ist für mich zu hoch.

    ich werde gleich mal meine drei dicken bücher durch forsten
    um die richtige syntax für den umgang mit strings raus zu bekommen.
    damit ich später auch meine einzelnen werte raus bekomme. 🙂

    ---------------edit-----------------

    die ausgabe in die textbox klappt jetzt bis auf die tatsache,
    das ich noch immer dieses leidige ascii zeichen für einen zeilen umsprung
    hinten am string habe und damit auch in der textbox sehe.

    hier nochmal der aktuelle, lauffähige quellcode.
    das programm ist aber noch nicht fertig.
    dazu muß ich einen neuen beitrag auf machen.


Anmelden zum Antworten