PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardware steuern mit VC++



Import-Script
09.03.2004, 22:56
Hallo, <BR>nachdem meine ersten Versuche den LPT Port mit C zu steuern erfolgreich waren, wollte ich auf VC&#43;&#43; und WinXP umsteigen. <BR>So wie ich es verstanden habe, brauche ich da eine DLL oder sowas. Nun habe ich diese Seite gefunden: <a href="http://www.geekhideout.com/iodll.shtml" target=_top>http://www.geekhideout.com/iodll.shtml</a> <BR> <BR>Ich habe mit dem MFC-Anwendungsassistenten eine exe erstellt und dem Projekt die Dateien io.cpp und io.h hinzugef&uuml;gt&#40;&uuml;ber &#34;Projekt/Dem Projekt hinzuf&uuml;gen/Dateien&#34;. Dann habe ich in die io.cpp die Zeile <BR>#include &#34;StdAfx.h&#34; <BR>eingef&uuml;gt. <BR>Aber was mache ich mit der dll? <BR>Wie lese ich nun einen Wert vom Port? <BR>Und was ist mit diesem Satz gemeint? <BR> <BR>&#34;The only step you are required to do is call LoadIODLL somewhere at the beginning of your program. Make sure you do this or you will find yourself faced with all sorts of interesting crashes.&#34; <BR> <BR>Mfg, <BR>Kurt

Import-Script
09.03.2004, 23:59
Keine Gewähr auf Richtigkeit&#40;ich bevorzuge zur Zeit Java&#41;: <BR>Schreibe in deine main&#40;&#41;-Funktion irgendwo am Anfang <BR> <BR>LoadIODLL&#40;&#41;; <BR> <BR>rein. <BR>In die Datei, wo deine main&#40;&#41;-Funktion steht, muss <BR> <BR>#include &#34;io.h&#34; <BR> <BR>. Dann kannst Du dich mit den anderen Funktionen, die in der io.h deklariert sind, austoben. <BR> <BR>Z.B.: <BR> <BR>char x; <BR>x = PortIn&#40;0x273h&#41;; <BR> <BR>In x sollte jetzt irgendwas vom Parallelport stehen&#40;ich hoffe, dass die Hexadezimalschreibweise so stimmt&#41;. <BR> <BR>PortIn -&#62; 8-BIT-Gerät, z.B. Parallelport <BR>PortWordIn -&#62; 16-Bit-Gerät, z.B. 16-Bit-ISA-Soundkarte <BR>PortDWordIn -&#62; 32-Bit-Gerät, z.B. PCI-Geräte

Import-Script
10.03.2004, 00:30
Eigentlich hat chrug chrug ja schon alles gesagt. <BR> <BR>NT/2000/XP erlaubt die direkten Portzugriffe nicht. Die saubere Methode ist die Verwendung eins eigenen virtuellen Gerätetreibers. Da gäbe es dann eine VXD Datei, die &uuml;ber eine DLL angesprochen wird. Im vorliegenden Fall ist der Autor wohl den einfacheren Weg gegangen, einen vorhandenen System Kernel Mode Treiber anzusprechen. <BR> <BR>Mit der Funktion LoadIODLL&#40;&#41; wird die DLL geöffnet &#40;LoadLibrary&#40;&#34;io&#34;&#41;;&#41; und sich die Adressen der Port-Funktionen beschafft &#40;GetProcAddress&#40;&#41;;&#41;. Anschl. noch den Treiber &uuml;berpr&uuml;fen und dann die DLL schliessen. <BR> <BR>Event. sind noch ein paar Typkonvertierungen nötig, damit VC nicht meckert &#40;Schau Dir die Datentypen an, die verwendet wurden z.B. Char, Short Int etc.&#41; <BR> <BR>Die Funktionen werden ja erläutert. Auf MFC w&uuml;rde ich als Anfänger verzichten oder brauchst Du etwa Klassenger&uuml;ste? &#40;Bläht nur den Code auf&#41;. <BR> <BR>Gruß Gerd

Import-Script
10.03.2004, 01:53
OK, werde ich mal probieren. <BR>Gibt es außer MFC denn noch eine andere Möglichkeit, echte Windows Programme also keine Konsolen zu schreiben? <BR>Ich habe vor kurzem erst C gelernt &#40;und bin immer noch dabei<img src="http://progshop.com/elektronik/diskussion/clipart/happy.gif" border=0>&#41;. Und f&uuml;r VC&#43;&#43; muss ich mir noch passende Literatur suchen. Das Buch &#34;Messen, Steuern, Regeln mit Visual C&#43;&#43;&#34; vom Franzis Verlag ist nicht so toll. <img src="http://progshop.com/elektronik/diskussion/clipart/sad.gif" border=0> <BR>

Import-Script
10.03.2004, 02:55
Windows Programme benötigen die MFC-Klassen nicht, sie sind nur ein Hilfmittel. Auch braucht man keinen objektorienten Code. Es gen&uuml;gen die Win32 API und C. Ein gutes Werk f&uuml;r den Anfang ist &#39;Programming Windows by Charles Petzold&#39;. Gibt&#39;s auch als deutsche Ausgabe &#40;sogar vereinzelt als chm im Netz &#40;engl.&#41;&#41;. <BR> <BR>Gruß Gerd

Import-Script
10.03.2004, 03:44
Da es doch etwas einfacher ist, habe ich nochmal eine Konsolenanwendung geschrieben. Nur bekomme ich die Fehlermeldung <BR>&#34;error C2065: &#39;PortIn&#39; : nichtdeklarierter Bezeichner&#34; <BR> <BR>#include &#34;stdafx.h&#34; <BR>#include &#34;stdio.h&#34; <BR>#include &#34;io.h&#34; <BR> <BR> <BR>LoadIODLL&#40;&#41;; <BR> <BR>int main&#40;int argc, char&#42; argv[]&#41; <BR>{ <BR> int x; <BR> x=PortIn&#40;0x378&#41;; <BR> return 0; <BR>} <BR>

Import-Script
10.03.2004, 15:44
Ist zwar nicht die feine Englische, aber so gehts erstmal. <BR> <BR>#include &#34;stdio.h&#34; <BR>#include &#34;io.cpp&#34; <BR> <BR>int main&#40;int argc, char&#42; argv[]&#41; <BR>{ <BR> int x; <BR> LoadIODLL&#40;&#41;; <BR> x=PortIn&#40;0x379&#41;; <BR> return x; <BR>} <BR> <BR>Die io.cpp selbst hab ich von der Erstellung ausgeschlossen.

Import-Script
10.03.2004, 16:32
Ahaa! Als Konsole geht es jetzt. Danke! <BR>Nun werde ich mal versuchen, es etwas moderner zu Visualisieren.

Import-Script
10.03.2004, 16:48
Was meinst du mit &#34;von der Erstellung ausgeschlossen&#34;? Sobald ich irgendwo #include &#34;io.cpp&#34; schreibe, werden 3 Fehler in der Datei gemeldet.

Import-Script
10.03.2004, 17:04
Was denn f&uuml;r Fehler? <BR>Vielleicht lässt mir mein altes Visual Studio 97 auch mehr durchgehen, als die neueren Versionen. <BR>Bei mir ging das so: <BR>Projekt -&#62; Einstellungen -&#62; io.cpp anklicken -&#62; allgemein -&#62; &#34;Datei von Erstellung ausnehmen&#34;. <BR> <BR>Oder hast du die io.cpp garnicht im Arbeitsbereich? EDIT: doch, steht ja schon oben..

Import-Script
10.03.2004, 18:35
Mit lcc funktioniert das sehr gut. io.cpp includieren ist schon richtig so &#40;gibt der Autor ja auch so vor&#41;. Die io.cpp muss sich im Verzeichnis befinden, sonst findet der Compiler sie nicht. <BR> <BR>Das Ganze mal als Byte deklariert. <BR> <BR>unsigned char byPort; <BR> <BR>Den Bibliotheksaufruf &uuml;berpr&uuml;fen <BR> <BR>if &#40;LoadIODLL&#40;&#41; != 0&#41; { <BR> printf&#40;&#34;%s&#34;, &#34;LoadIODLL versagte&#34;&#41;; <BR> return -1; <BR>} <BR> <BR>Ein Byte vom Statusport lesen. Falls ein Drucker angeschlossen ist, das ganze mal ohne Papier aufrufen. <BR> <BR>byPort = PortIn&#40;0x379&#41;; <BR> <BR>und als Hexwert ausgeben <BR> <BR>printf&#40;&#34;0x%x&#34;, byPort&#41;; <BR> <BR>Gruß Gerd

Import-Script
11.03.2004, 02:10
Hallo Gerd, <BR>wie gesagt, als Konsolenanwendung geht es. <BR> <BR>Könntest du mir vieleicht eine Schritt f&uuml;r Schritt Anleitung geben, wie ich ein einfaches Programmerstelle? Wenn möglich mit MFC, da habe ich die meisten Infos dr&uuml;ber. Ich hatte versucht ein Prog zu schreiben, dass &uuml;ber zwei Schaltflächen entweder 0 oder 255 auf den Port ausgibt.

Import-Script
11.03.2004, 04:13
Sorry Kurt, erstens habe ich z.Z. kein VC installiert und zweitens verwende ich kein MFC. MFC hat eine andere Syntax, benutzt andere Funktionsnamen, verwendet den Doppelpunktoperator um Funktionen aufzurufen, verwendet zur Nachrichtenverarbeitung Message Cracker, ist eigentlich f&uuml;r&#39;s objektorientierte Codedesign gedacht - kurzum alles anders als mit reiner Win32 API &#40;wenn auch ähnlich&#41;. Das schafft als Neuling zusätzliche Probleme. Wenn Du es Dir trotzdem antuen möchstest, es gibt ja das Scribble Tutorial, ist aber ziemlich umfangreich. <BR> <BR>Ansonsten tuts ein einfacher Dialog als Hauptprogramm. Das erzeugt aber auch der Wizard. Schau Dir die den Quelltext dazu an. <BR> <BR>Ich möchte Dir nochmal den Petzold anraten &#40;oder ein anderes Buch&#41;. Ebenso Teile der VC Online Hilfe. <BR> <BR>Eine kurze Einf&uuml;hrung sogar in deutsch gibt&#39;s auch hier &#40;das funktioniert mit VC genauso&#41;. <BR> <BR><a href="http://members.tripod.de/ValentinC/lccwin32/Tutorials/tutorials.html" target=_top>http://members.tripod.de/ValentinC/lccwin32/Tutorials/tutorials.html</a> <BR> <BR>F&uuml;r eine einfache dialog basierte Anwendung am besten mit einem Grundger&uuml;st arbeiten und dieses ergänzen. <BR> <BR>#include &#60;windows.h&#62; <BR>#include &#34;resource.h&#34; <BR> <BR>LRESULT CALLBACK DialogProc&#40;HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam&#41;; <BR> <BR>//&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;/ <BR>int WINAPI WinMain&#40;HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow&#41; <BR>{ <BR> DialogBox&#40;hInst, MAKEINTRESOURCE&#40; IDD_DIALOG1 &#41;, NULL, DialogProc&#41;; <BR> return TRUE; <BR>} <BR>//&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;/ <BR> <BR>LRESULT CALLBACK DialogProc&#40;HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam&#41; <BR>{ <BR>// lokale Variable hier unterbringen <BR>switch &#40;msg&#41; <BR>{ <BR> case WM_INITDIALOG: <BR> // Initialisierungen hier eintragen <BR> break; <BR> case WM_COMMAND: <BR> // Beginn Nachrichtenschleife des Dialogs <BR> switch &#40;LOWORD&#40;wParam&#41;&#41; <BR> { <BR> case IDCANCEL: <BR> EndDialog&#40;hDlg,TRUE&#41;; // Dialog beenden <BR> break; <BR> case IDOK: <BR> MessageBox&#40;hDlg,&#34;OK betätigt!&#34;,&#34;Nachricht an Benutzer&#34;,MB_OK&#41;; <BR> break; <BR> } <BR> break; <BR> // Ende Nachrichtenschleife des Dialogs <BR> case WM_DESTROY: <BR> // Ressourcen freigeben z.B. allozierter Speicher <BR> MessageBox&#40;hDlg,&#34;Empfange WM_DESTROY Nachricht&#34;,&#34;Nachricht an Benutzer&#34;,MB_OK&#41;; <BR> break; <BR> default: <BR> // nicht bearbeitete Nachrichten an Windows zur&uuml;ckgeben <BR> return FALSE; <BR> } <BR> return TRUE; <BR>} <BR>//&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;/ <BR> <BR>Leeres Projekt erstellen, Code hineinkopieren &#40;als .c&#41;, dazu noch einen Dialog mit dem Ressource Editor erstellen und IDD_DIALOG1 nennen und compilieren. Und sich mit der Syntax vertraut machen - wohlgemerkt bei MFC -&#62; alles anders. <BR> <BR>Gruß Gerd

Import-Script
11.03.2004, 12:23
@Gerd K: erinnert mich eher an eine Bundestagsdebatte, als an einen C-Source... <BR> <BR>Das beste ist der Kommentar &#34;...wohlgemerkt...&#34;<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>

Import-Script
11.03.2004, 13:31
Jetzt klappt es auch als dialogfeld basierte Anwendung. Zwar immer noch als MFC aber immerhin. <BR> <BR>Ich habe das Buch &#34;VC&#43;&#43; in 21 Tagen&#34;. Ist ganz interessant. <BR>Das gibt es sogar Online: <a href="http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm" target=_top>http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm</a> oder als &#42;.PDF

Import-Script
11.03.2004, 17:27
@Andreas <BR>Tja, leider bleibt Formatierung hier auf der Strecke. Ist ansonsten aber eher schlicht. Windows verharrt in der Hauptnachrichtenschleife und je nach Message erfolgt eine Reaktion &#40;Case ... &#41; oder die Nachricht wird ignoriert bzw. zur&uuml;ck an Windows geschickt. <BR> <BR>@Kurt <BR>Es gibt einiges im Netz zu dem Thema. Dann mal gut schmöcker! <BR> <BR>Gruß Gerd

Import-Script
11.03.2004, 18:41
void void, viel Spass {void} unsigned by A.Seck {void} <img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR> <BR> <BR>langsam macht C echt Spass. Muss wohl umsteigen <BR> <BR>procedure tunix <BR>begin <BR>end; <BR> <BR>wird langweilig; besser noch ein int main, char 4711 {void} {void}, int&#42;{void}, &#34;viel void, viel gut&#34; Ctrl P, &amp;h22, case break <BR> <BR>C ist klasse; versteht jeder sofort<img src="http://progshop.com/elektronik/diskussion/clipart/lol.gif" border=0>

Import-Script
20.03.2004, 20:39
Jetzt habe ich noch Probleme mit der seriellen Schnittstelle: <BR>Das Programm, dass im PDF auf Seite 22/23 angegeben ist, läuft unter WIN98 ohne Probleme. Wenn ich es aber f&uuml;r WIN XP umschreibe &#40;mit der io.dll&#41; geht es nicht mehr. Ich glaube, es werden nur Leerzeichen in einer Endlosschleife auf dem Bildschirm angezeigt. <BR> <BR>Entschuldigt bitte, falls C und C&#43;&#43; durcheinandergew&uuml;rfelt sind. Es ist ja nur ein kleines Testprogramm um Grundlagen zu sammeln <BR> <BR><!--attachment: serial-12198.pdf*mime_pdf.gif*application/pdf*143.0*serial%2epdf*serial%2epdf --><center><table border=1><tr><td><img src="http://progshop.com/elektronik/diskussion/icons/mime_pdf.gif" align=left alt="application/pdf">serial.pdf<br><a href="http://progshop.com/elektronik/diskussion/messages/4285/serial-12198.pdf" target="_blank"><b>serial.pdf</b></a> (143.0 k)</td></tr></table></center><!--/attachment--> <BR><!--attachment: win98-12199.txt*mime_txt.gif*text/plain*1.3*WIN98*win98%2ec --><center><table border=1><tr><td><img src="http://progshop.com/elektronik/diskussion/icons/mime_txt.gif" align=left alt="text/plain">WIN98<br><a href="http://progshop.com/elektronik/diskussion/messages/4285/win98-12199.txt" target="_blank"><b>win98.c</b></a> (1.3 k)</td></tr></table></center><!--/attachment--> <BR><!--attachment: winxp-12200.txt*mime_txt.gif*text/plain*1.5*winxp*winxp%2ecpp --><center><table border=1><tr><td><img src="http://progshop.com/elektronik/diskussion/icons/mime_txt.gif" align=left alt="text/plain">winxp<br><a href="http://progshop.com/elektronik/diskussion/messages/4285/winxp-12200.txt" target="_blank"><b>winxp.cpp</b></a> (1.5 k)</td></tr></table></center><!--/attachment-->

Import-Script
20.03.2004, 22:09
Nur so ein Verdacht: <BR>Deaktiviere mal im Gerätemanager den gew&uuml;nschten COM-Port.

Import-Script
20.03.2004, 22:29
Bringt leider nichts.

Import-Script
21.03.2004, 01:03
F&uuml;r die serielle Schnittstelle unter Win9x/NT w&uuml;rde ich das auch nicht einsetzen. Daf&uuml;r gibt es in VC Funktionen wie TransmitCommChar&#40;&#41; &#40;Einfach mal nach &#34;Communications Functions&#34; suchen&#41;. COMx Schnittstellen werden wie Dateien behandelt, also mit hCom = CreateFile&#40;&#34;COM2&#34;, ..., ... &#41; geöffnet &#40;hCom bekommt dann ein Handle&#41;. Die Funktionen besitzen vor allen R&uuml;ckgabewerte, mit denen sich der Erfolg der Aktionen sicherstellen läßt. <BR> <BR>Den Parallelport habe ich unter Win98 mal probeweise mit der IO.DLL lesend ausprobiert - klappte gut. NT/XP habe ich derzeit leider nicht installiert. Was COMx und die IO.DLL anbetrifft habe ich meine Bedenken bei dem Punkt &#39;turn off interrupts&#39; in dem Beispiel. Ist nur was f&uuml;r DOS da Interrupts von Windows verwaltet werden &#40;und sich zumindest XP auf diese Weise bestimmt nicht reinreden läßt&#41;. Die Parameter &#40;Baudrate etc.&#41; setzen sollte eigentlich auch mit IO.DLL gehen. Sehr hilfreich kann da auch ein einfacher RS-232 Protokoll Analyser &#40;y-Kabel&#41; und ein zweiter Rechner sein &#40;siehe <a href="http://www.beyondlogic.org" target=_top>www.beyondlogic.org</a>, geht auch mit einer Win32 Terminalsoftware&#41;, denn irgendwie muß man ja auch definiert Zeichen auf die Schnittstelle geben können &#40;vor allem bei µC Anbindungen sehr aufschlussreich&#41;. <BR> <BR>Zur&uuml;ck zum Beispiel. Dort wird ja das Line Status Register Bit 0 abgefragt, ob ein Zeichen eingetroffen ist. Um das zu &uuml;berpr&uuml;fen könnte man einmal nur dieses Register pollen &#40;Endlosschleife abfragen&#41; und gezielt mal ein Zeichen auf COMx senden &#40;vielleicht geht das detektieren unter XP ja schon nicht&#41;. <BR> <BR>Gruß Gerd

Import-Script
22.03.2004, 18:06
Danke Gerd, das hat mir sogar schon geholfen. Bis zum nächsten mal.<img src="http://progshop.com/elektronik/diskussion/clipart/wink.gif" border=0>