comm ansteuerung auf allen windowssystemen ohne nt



  • Ahja und als Intermezzo noch etwas stilistisches: Normalerweise, wenn man schon eine kapselnde Funktion schreibt wie z.B. du deine ModeSet, dann verwendet man innerhalb der Klasse ebenfalls nur noch konsequent diese Funktion um Fehler vorzubeugen... Geht auch etwas weg von Copy-Paste-Programmierung (Du hast z.B. bei Open() den ganzen Klimbim aus ModeSet übernommen...) (o:

    Das aber nur so nebenbei.

    -junix



  • Aber kommt das Programm bei ModeSet auch wirklich bei SetCommState() vorbei? (-Debugtip: Breakpoint da setzten und schauen ob das Programm da anhält)

    =>
    vielen dank für die hilfe, nur geht es noch immer nicht, ich bin ganz sicher das es dort vorbei kommt, denn sonst gibt er eine Fehlermeldung aus und das habe ich schon getestet, aber schau dir mal die methode ReadData4800 an, stimmt der umschaltbefehl oder ist er nur win98 tauglich? du hast auch erwähnt das du ein ähnliches problem hattest, als du nach der grösst möglichen baudrate gesuchtb hast, das wäre ein längerfristiges ziel von mir, könntest du mir etwas auf die sprünge helfen? bin ein ziemlicher newbie in c++ einzig java kenne ich ziemlich gut und das ist für mein problem nicht geeignet...



  • könnte es sein das die ReadData4800 methode overlapped ist und der rest nicht?



  • Da fällt mir was auf... Funktioniert das Lesen/Schreiben überhaupt unter den NT-Derivaten? Ich hatte damals das Problem, dass unter 2000 sich die Write-Funktion aufgehängt hat (hatte sie im Overlapped-Modus). Als ich dem Fehler nachgegangen bin, bemerkte ich, dass zwei Parameter der Overlapped-Struktur welche in der SDK-Doku als Ignored unter NT/2000 dokumentiert waren, nicht 0 waren. Als ich sie explizit auf 0 setzte, war alles bester Ordnung. Initialisier die Struktur mal ordentlich mit 0 und versuchs nochmal.

    Was das finden der höchsten Baudrate betrifft, so war das ein rel. umständlicher Ablauf, den ich hier auch nicht ohne Weiteres schildern kann... gehört eigentlich auch nicht weiter zum Thema. Vielleicht dazu soviel:

    Wir haben immer ein definiertes Byte hin und her geschickt. Jeder hat immer gewartet, bis der andere das byte zurückgeschickt hat oder ein Timeout eingetreten ist.

    Das lief in etwa so:

    1. Der Host sendet die neue Baudrate
    2. Der Host fällt in eine definierte Warteschleife um zu warten, bis sich das 
       Target auf die neue Baudrate eingestellt hat. (und stellt sich natürlich selbst um)
    3. Der Host sendet ein definiertes Byte (z.B. 0x55) und errechnet seine 
       private Checksumme (bei uns war das schlichtes invertieren)
    4. Das Target empfängt das Byte, errechnet daraus seine Checksumme. 
    5. Diese Checksumme sendet das Target an den Host.
    6. Der Host sendet die empfangene Checksumme an das Target zurück
    7. Beide vergleichen die jeweils selbst errechnete und die empfangene Checksumme
       miteinander. sind sie identisch, bleibt  die neue Baudrate erhalten. Ansonsten
       gehen beide zurück auf die alte Baudrate.
    

    Mit dem Ganzen zauber ist die Kommunikation in beide Richtungen geprüft. Das Spiel wird solange wiederholt, bis beide einander verstehen. Dabei ist die Baudrate jeweils sinkend...
    (also z.B. 230 400, 115 200, 57 600, ...)

    -junix



  • Das oben beschrieben Verfahren zur Ermittlung der max. Baudrate ist übringes Programmiersprachenunabhängig (o;

    -junix



  • ja klingt einleutend, werde ich so versuchen und hoffe das es klappt, aber zuerst muss ich ja einmal auf 4800 baud umschalten können und das geht nicht, habe jetzt noch die writeABuffer methode herausgenommen weil sie overlapped ist, aber alle anderen parameter die das overlapped struktur betreffen sind auf NULL gesetzt. sorry das ich so afdringlich nachfrage, aber sonst komme ich nicht weiter, habe keine idee zu einem lösungansatz



  • wie ist der befehl zum umschalten auf 4800 bps? habe das gefühl das meiner nur win98-spezifisch ist....



  • Ne, Isser ned, ganz normal das DCB-Struct füllen und dann mit SetCommStatus setzen... das ist schon in Ordnung...

    -junix



  • hallo,
    ich muss nochmal nachahken, habe es noch immer nicht geschafft auf win 2000 zu kommunizieren, das programm hängt sich immer wieder auf. du hast geschrieben du hättest ein ähnliches problem gehabt weil der write befehl auf overlapped gesetzt war. ist es richtig das er so auf nicht overlapped ist?

    WriteFile(hComm, lpBuf, dwToWrite, &dwWritten, NULL)

    oder hat noch ein anderer parameter einfluss auf diese struktur ausser der hinterste der jetzt auf null ist? oder muss man ih aders setzen?



  • o shit, habe vergessen mich einzuloggen. und deutsche splache schwele splache.


Anmelden zum Antworten