Serielle Schnittstelle



  • hallo,

    bin neu im programmierung und brauche eure hilfe.
    folgendes:
    ich möchte über die serielle schnittstelle einen -string+"\1b"- senden und das was ich emfange auswerte (z.b. string[5]) -> ohne erfolg. bestimmt habe ich einen denkfehler drin, wo ich nict mehr voran komme.
    ich hoffe das ich mich verständlich ausgedruckt habe, wenn nötig könnte ich auch die cpp-datei einfügen.
    könnt ihr mir bitte weiter helfen?
    danke im voraus.



  • Schau mal hier:
    http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html
    Teil 8 ist ein ganzes Projekt mit dem du ASCII Daten austauschen kannst.
    Das Projekt stammt aus dem Buch von Prof. Kaiser welches man nur empfehlen kann.Ich hoffe das hilft dir schon mal weiter.

    Gruß myerscola



  • Danke erstmal. ich schau mir es an. falls ich noch fragen haben sollte melde ich mich. 😉



  • hallo,

    ich bin mit meinem programm auch soweit wie "kurs8".
    was ich eigentlich haben möchte ist: nicht wie in "kurs8" das ich die ausgabe von der empfangen zeichen-anzahl erhalte, sondern den text ausgebe, was ich empfangen habe.
    ich hoffe das ist verständlich für dich, was ich meine.



  • Ich verstehe schon was Du willst, aber das Projekt kann auch ASCII-Zeichen empfangen und ausgeben, vorausgestzt Dein ser. Gerät sendet auch welche!!
    Wenn das Gerät binäre Daten sendet (meist bei Messgeräten)dann wird es schwieriger, vor allem wenn keine Beschreibung der Datenstruktur vorliegt.
    Was willst Du überhaupt für ein Gerät auslesen?



  • ich möchte aus einem scanner (barcode / strichcode decoder) die parametierung auslesen und ändern können. das kann man auch über hyper terminal auslesen und ändern, aber wollte mir eine vereinfachte und angepasste terminal programm schreiben.
    das gerät sendet die informationen, wie baudrate, stopbits, und viele andere parameter. und auch wenn der scanner den barcode decodiert hat, sendet er diesen barcode information, z.b. in einer zahlen kombination "123434567897" oder gemischt "123can876". diese information wollte ich überprüfen, ob nur reine zahlen oder gemischte kombination aungekommen ist.



  • Ich habe jetzt mit einem ser. Barcodescanner noch nicht gearbeitet, sondern nur welchen in die Tastaturleitung eingeschleift werden und die liefern immer ASCII-Zeichen.
    Um noch mal auf das Projekt zurückzukommen, Du brauchst dafür auch 2 ser. Ports, einen der sendet und einen der empfängt. Die 2 mußt Du dann auch mit einem Nullmodem-Kabel verbinden.Mit "start empfang" bekommst Du dann auch Klartext zurück.Um mit dem Scanner zu arbeiten mußt Du lediglich die Methode die Dir die Anzahl bringt deaktivieren und senden und empfangen auf den gleichen Port bringen, dann ist das Projekt ein stark abgespecktes Hyperterminal.



  • einen sehr großen dank an dich, die hilfen die du mir gegeben hast, hat mir geholfen. jetzt kann ich daten im klartext senden und empfangen.
    ich nerve aber es tut mir leid.
    folgendes:
    die ausgabe von den empfangenen daten in der memo1 beginnt immer in einer neue zeile -> ein zeichen je zeile (Memo1->Lines->Add(s)
    - wie kann ich denn alles in einer zeile schreiben?

    was noch mir aufgefallen ist für die empfangene daten:
    wenn BufSize hoch ist, reagiert das programm sehr langsam
    - const int BufSize = 10; <- dieser wert
    int i;
    char Buffer[BufSize];
    und wenn diese werte hoch sind, reagiert das programm sehr langsam
    - in void SetReadTimeouts(HANDLE hCom)
    - t.ReadIntervalTimeout = 100;
    - t.ReadTotalTimeoutMultiplier = 10;
    - t.ReadTotalTimeoutConstant = 1;
    warum eigentlich und wie kann man das beheben?
    danke im voraus 🙂



  • Eine Zeile: das einfachste wäre sicher
    Memo->Text = Memo->Text + s;
    allerdings solltest du darüber nachdenken, die gelesenen Zeichen zu puffern und dann Zeilenweise zum Memo hinzuzufügen. Entweder gibt es ein Zeichen, was das Zeilenende markiert oder man definiert einen Timeout (s.u.)

    "reagiert langsam": Das sollte selbsterklärend sein. ReadTimeOut bezeichnet die Zeit, die die Schnittstelle auf ein weiteres Zeichen wartet, bevor die Leseoperation beendet wird.
    Da ReadTimeOutMultiplier mit der Anzahl der zu lesenden Bytes multipliziert wird führt eine große Anzahl zu lesender Bytes in Verbindung mit einem großen TimeoutMultiplier zu einer langen Wartezeit.
    Beheben kann man das, indem man sinnvolle Werte einsetzt. Sieh dir mal den Artikel zu COMMTIMEOUTS in der MSDN an.
    Vorschlag:
    ReadIntervalTimeout = MAXDWORD;
    ReadTotalTimeoutMultiplier = 0;
    ReadTotalTimeoutConstant = 0;



  • danke dir für deine hilfen soweit funktioniert.
    noch zwei probleme:
    1)ich kann die einstellungen (baud, parity, usw.) im programm setzen und ändern. die werte werden übernommen von DCB aber nicht angewendet.
    mein ansatz: die einstellungen für baud, parity, usw. nehme ich über einen form vor und beim schliessen des forms sollte es übernehmen.
    meine frage: wie kann ich diese werte neu initialisieren, so das es angewendet wird?
    2)ich habe auf der hauptform ein sende button. mit dieser button möchte ich das text in der edit1 feld senden, aber mit esc-sequens als anhang.
    meine frage: wie kann ich es ralisieren?
    zur hilfe: SendData(Edit1->Text.c_str(),Edit1->Text.Length());"
    dnake im voraus



  • hallo,

    ich muss ein prog schreiben, was daten über die serielle schnittstelle
    leitet. es soll auf der einen seite daten von einem thermostaten
    (julabo) empfangen und auf der anderen seiten wieder daten zurück
    schicken.

    also mit hilfe diverser codes habe ich es hinbekommen, dass er
    erfolgreich ein port öffnet...

    nun meine fragen:
    - wie kann man software-seitig sicher gehen, daß auch wirklich ein gerät
    an diesem port ist? kann man das irgend wie prüfen?

    - wie genau müssen die daten aussehen, die ich sende?
    in der anleitung des thermostaten steht, die "übertragung der zeichen
    erfolgt gemäß din 66022 und din 66003, codetabelle 1".
    das sagt mir nicht wirklich was .... 😞
    ich weiß nicht, ob ich die befehle in 'normalen' zeichen (a,b,c,..) oder
    in den hex-codes senden muss. ausserdem ist mir rätzelhaft, wie ich den
    string definieren muss (dword, char, ....)!?

    kann mir vielleicht irgend jemand helfen?


Anmelden zum Antworten