Com Port ansprechen...



  • Sorry, ich habs nicht genau genug bschrieben!

    Wir bauen einen Analog - Digitalwandler, welcher an den Com Port angeschlossen wird! An diesen AD-Wandler wird eine Spannung angelegt und diese Spannung soll halt von einem C++ Programm ausgegeben werden...

    Ich hoffe so ist klar was ich meine! Hast du ne Idee wie ich die Digitalen Signale am Com Port auslese?

    Gruß, Michael



  • garby schrieb:

    Hast du ne Idee wie ich die Digitalen Signale am Com Port auslese?

    Mit Standard-C++ gar nicht. Noch einmal: Welches BS verwendest du?



  • Win 2K!

    Geht das denn dann mit C?

    Tut mir leid wenn ich nerve, aber ich habe keine Ahnung!



  • Sicher geht es.
    Warte bis der Thread von den Mods ins richtige forum verschoben wurde.



  • Jover schrieb:

    Warte bis der Thread von den Mods ins richtige forum verschoben wurde.

    Hektik ist die Mutter aller Fehler.
    Also ab nach WinAPI.



  • Jover schrieb:

    Ich werde Hume jetzt ein bisschen Entlasten:
    Ist kein std C++ Problem.
    OS, Lib?

    Spannungen am COM-Port? Hast du dich da nicht vertippt?

    Edit: Fehler 🙄

    humme sagt oft "Ist kein std C++ Problem" obwohls damit auch ginge!

    Beispiel als hier mal gefragt wurde wie man auf den VideoMemory zugreifen konnte oder Farbige Textausgabe:

    char c = (*(unsigned short*)0x410&0x30);//Detects video card type, vga or mono
    
    	if(c == 0x30) //c can be 0x00 or 0x20 for colour, 0x30 for mono
    	{
    		videomem = (unsigned short*) 0xb0000;
    		crtc_mem   = 0x3B4;	// mono
    	}
    	else
    	{
    		videomem = (unsigned short*) 0xb8000;
    		crtc_mem   = 0x3D4;	// colour
    	}
    


  • @garby: Ich will sowas auch gerade machen. Schau mal auf http://www.winapi.net/forum/viewtopic.php?t=445 😉



  • Vielen Dank erstmal für eure Hilfe, aber irgendwie komm ich mit den ganzen Beispielen noch nicht klar...??? Ist Irgendwie zu kompex für mich, glaub ich! 😕

    Ich habe allerdings gerade gelesen dass man das ähnlich realisieren kann wie das lesen aus einer txt datei.

    Hat dazu villeicht jemand ein Beispiel? Konnte nichts genaueres herrausfinden...





  • Nein, flenders. Das ist der Parallelport.



  • humme sagt oft "Ist kein std C++ Problem" obwohls damit auch ginge!

    Also erstmal heiße ich Hume und nicht Humme und zweitens sage ich dass natürlich nur dann, wenn es auch stimmt. Den Com-Port kann man in Standard-C++ z.B. nicht ansprechen, da der Standard keinen Com-Port kennt.
    Dein Code ist btw. auch nicht wirklich Standard-C++, da du von Annahmen ausgehst, die durch den Standard keinesfalls unterstützt werden. Der C++-Standard kümmert sich schließlich nicht darum, wo der Video-Speicher ist.



  • kannst dich auch mal im konsolenfaq umschauen
    http://www.c-plusplus.net/forum/viewtopic.php?t=45173
    und ein andere beschäftigen sich mit com

    @hume
    der hat dich wahrscheinlich garnicht gemeint.
    "humme" sieht eher nach .. hmm ... hummel aus. 😉
    müsste doch jedem einleuchtend sein, daß so sachen wie farbe und comport und vieles mehr nicht standard sind. man könnte ja auch mal in den standard schauen 🙂
    http://www.kuzbass.ru:8086/docs/isocpp/
    bevor man sich in die nesseln setzt.

    linux, windows, apple,... so viele unterschiedliche systeme... so viele welten...



  • @garby,

    liefert denn der AD-Wandler ein V.24-Signal (also irgendwas mit Start-/Stopbit und 7 oder 8 Datenbits und einer festen Datenrate) oder nur eine Aneinanderreihung von Bits? Suche mal nach Burkhard Kainka oder TLC 548 im Netz, vielleicht löst das Deine Probleme.

    Blackbird



  • Also eigentlich ist der AD Wandler so konstruiert, dass ich eine in einem schnellen Takt immer zwichen -12V und +12V wechselnde Spannung über den Com Port sende. Es wird hierdurch ein Condensator aufgeladen und entladen...
    Wenn nun die zu messende Spannung gleich der am Condensator ist, kommt ein Signal am Com Port an. Nun sollte ich eigentlich durch den gegebenen Takt und die Abstände zwischen den Signalen die anliegende Spannung in meinem Programm errechnen können!

    Ich hoffe das ist verständlich!?

    Gruß, Michael



  • Einen "Takt" kann man über den COM-Port nicht erzeugen, jedenfalls keinen, der diese Bezeichnung auch verdient. Man kann zwar RTS und DTR ein- und ausschalten

    EscapeCommFunction (hCom, SETDTR); // Setzten der DTR-Leitung
    EscapeCommFunction (hCom, RESETDTR); // Rücksetzten der DTR
    

    aber das ist nicht genau genug, da Windows Dein Prog immer mal wieder unterbricht. Man könnte jetzt den Kondensator und seine Auf-/Entladephase sehr groß machen und hätte damit dieses Problem verringert. Auch mehrere Messungen und Mittelwertbildung (jedoch die "Ausreißer" rausfiltern) bringt Genauigkeit.
    Was bleibt, ist immer noch die Erfassung der Zeitdifferenz zwischen der gesendeten Taktflanke und dem Wechsel der Komparatorausgangsspannung.

    GetCommModemStatus (hCom, &ComStatus); 
    if (ComStatus & MS_CTS_ON) // Wechsel der Komparatorausgangsspannung
    

    Auch da kann Windows "zwischenfunken".

    Aber zum Probieren reichts allemal.

    Blackbird



  • Das ist schon mal ein sehr guter Ansatz... Danke!

    Allerdings muss ich auch noch andere Pins abfragen, nicht nur Pin8 (CTS) sondern auch noch DCD, DSR und Pin 9 (angeblich Test-pin) weiß leider nicht den Namen...
    Weißt du villeicht wie der heißt?

    Kann ich das dann damit genau so machen? Einfach mit zB.
    "if (ComStatus & MS_DCD_ON)" ansprechen?



  • Pin 9 ist RI (Ring Indicator).
    Dein Prog sollte einen Thread haben, der nur den COM-Port bedient.
    Grobe Stuktur des Threads:
    - // Vergleichs-Maske setzen für SetCommMask, die bestimmt, welche Ereignisse auftreten können
    DWORD dwEvtMask = EV_CTS | EV_DSR | EV_BREAK | EV_RING | EV_RXCHAR | EV_RLSD | EV_ERR | EV_RXFLAG | EV_TXEMPTY;
    - DWORD dwEvtMaskIn = 0; // Eingabe-Maske, in die WaitCommEvent aktuelle Werte schreibt
    - // Com Port öffnen (hCom)
    - SetCommMask (hCom, dwEvtMask); // setzen der Maske
    - // Create an event object for use in WaitCommEvent in OVERLAPPED struct o
    - jetzt in einer Schleife (solange der Thread leben soll):
    {
    - WaitCommEvent (hCom, &dwEvtMaskIn, &o); // EventMask "scharf machen"
    - if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
    - Zeit holen (mit QueryPerformanceCounter)
    - jetzt das Ereignis bestimmen, welches den Event ausgelöst hatte:
    if (dwEvtMaskIn & EV_RXCHAR)
    {
    //irgendwas tun
    }
    if (dwEvtMaskIn & EV_CTS)
    {
    //irgendwas tun
    }
    ...
    }
    - aufräumen

    Besser wäre es, in der Schleife nur die Ziet zu holen und mit PostThreadMessage das Ereignis einem anderen Thread/Process zusenden. Der prüft dann, welches Ereignis es war (if (dwEvtMaskIn & EV_xxx)) und bearbeitet/verteilt es weiter.
    Das Senden von Pegelwechseln an DTR und RTS kann von einem anderen Thread/process aus erfolgen, jedoch mit den gleichen "Daten" des bereits geöffneten COM-Ports.

    Willst Du Dir wirklich die Arbeit machen? Zielt die Formulierung in Deiner Praktikums-Aufgabe nicht auf eine einfachere Lösung?

    Lernen tut man 'ne Menge, wenn man den (scheinbar) schwereren Weg geht.

    Hier mal ein Auszug aus einer Log-Datei, die so eine Abfrage der COM-Pins macht:

    Start: Mo, den 16.12.2002 um 10:59 Uhr 24,243 Sek.
    CTS : 5 µs
    CTS : 1075378 µs
    CTS : 1792208 µs
    CTS : 2509189 µs
    CTS : 3226400 µs
    CTS : 3584650 µs
    DSR : 4301660 µs
    DSR : 5036223 µs
    DSR : 5747337 µs
    DSR : 6105858 µs
    BREAK : 7907542 µs
    ERR : 7907542 µs
    RXCHAR : 7950211 µs
    RXFLAG : 7950211 µs
    BREAK : 9699923 µs
    ERR : 9699923 µs
    RXCHAR : 9742593 µs
    RXFLAG : 9742593 µs
    DSR : 14350686 µs
    CTS : 16143116 µs
    DSR : 17218389 µs
    DSR : 19369181 µs
    BREAK : 20812452 µs
    ERR : 20812452 µs
    RXCHAR : 20855122 µs
    RXFLAG : 20855122 µs
    BREAK : 26189531 µs
    ERR : 26189531 µs
    RXCHAR : 26232201 µs
    RXFLAG : 26232201 µs
    DSR : 60234785 µs
    DSR : 60951672 µs
    DSR : 61668771 µs
    BREAK : 63111945 µs
    ERR : 63111945 µs
    RXCHAR : 63154622 µs
    RXFLAG : 63154622 µs
    BREAK : 64904262 µs

    Blackbird


Anmelden zum Antworten