Com Port ansprechen...
-
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...
-
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äumenBesser 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 µsBlackbird