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++ 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ügt(über "Projekt/Dem Projekt hinzufügen/Dateien". Dann habe ich in die io.cpp die Zeile <BR>#include "StdAfx.h" <BR>eingefü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>"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." <BR> <BR>Mfg, <BR>Kurt
Import-Script
09.03.2004, 23:59
Keine Gewähr auf Richtigkeit(ich bevorzuge zur Zeit Java): <BR>Schreibe in deine main()-Funktion irgendwo am Anfang <BR> <BR>LoadIODLL(); <BR> <BR>rein. <BR>In die Datei, wo deine main()-Funktion steht, muss <BR> <BR>#include "io.h" <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(0x273h); <BR> <BR>In x sollte jetzt irgendwas vom Parallelport stehen(ich hoffe, dass die Hexadezimalschreibweise so stimmt). <BR> <BR>PortIn -> 8-BIT-Gerät, z.B. Parallelport <BR>PortWordIn -> 16-Bit-Gerät, z.B. 16-Bit-ISA-Soundkarte <BR>PortDWordIn -> 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 ü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() wird die DLL geöffnet (LoadLibrary("io");) und sich die Adressen der Port-Funktionen beschafft (GetProcAddress();). Anschl. noch den Treiber überprüfen und dann die DLL schliessen. <BR> <BR>Event. sind noch ein paar Typkonvertierungen nötig, damit VC nicht meckert (Schau Dir die Datentypen an, die verwendet wurden z.B. Char, Short Int etc.) <BR> <BR>Die Funktionen werden ja erläutert. Auf MFC würde ich als Anfänger verzichten oder brauchst Du etwa Klassengerüste? (Bläht nur den Code auf). <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 (und bin immer noch dabei<img src="http://progshop.com/elektronik/diskussion/clipart/happy.gif" border=0>). Und für VC++ muss ich mir noch passende Literatur suchen. Das Buch "Messen, Steuern, Regeln mit Visual C++" 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ügen die Win32 API und C. Ein gutes Werk für den Anfang ist 'Programming Windows by Charles Petzold'. Gibt's auch als deutsche Ausgabe (sogar vereinzelt als chm im Netz (engl.)). <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>"error C2065: 'PortIn' : nichtdeklarierter Bezeichner" <BR> <BR>#include "stdafx.h" <BR>#include "stdio.h" <BR>#include "io.h" <BR> <BR> <BR>LoadIODLL(); <BR> <BR>int main(int argc, char* argv[]) <BR>{ <BR> int x; <BR> x=PortIn(0x378); <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 "stdio.h" <BR>#include "io.cpp" <BR> <BR>int main(int argc, char* argv[]) <BR>{ <BR> int x; <BR> LoadIODLL(); <BR> x=PortIn(0x379); <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 "von der Erstellung ausgeschlossen"? Sobald ich irgendwo #include "io.cpp" schreibe, werden 3 Fehler in der Datei gemeldet.
Import-Script
10.03.2004, 17:04
Was denn fü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 -> Einstellungen -> io.cpp anklicken -> allgemein -> "Datei von Erstellung ausnehmen". <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 (gibt der Autor ja auch so vor). 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 überprüfen <BR> <BR>if (LoadIODLL() != 0) { <BR> printf("%s", "LoadIODLL versagte"); <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(0x379); <BR> <BR>und als Hexwert ausgeben <BR> <BR>printf("0x%x", byPort); <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ür Schritt Anleitung geben, wie ich ein einfaches Programmerstelle? Wenn möglich mit MFC, da habe ich die meisten Infos drüber. Ich hatte versucht ein Prog zu schreiben, dass ü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ür's objektorientierte Codedesign gedacht - kurzum alles anders als mit reiner Win32 API (wenn auch ähnlich). 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 (oder ein anderes Buch). Ebenso Teile der VC Online Hilfe. <BR> <BR>Eine kurze Einführung sogar in deutsch gibt's auch hier (das funktioniert mit VC genauso). <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ür eine einfache dialog basierte Anwendung am besten mit einem Grundgerüst arbeiten und dieses ergänzen. <BR> <BR>#include <windows.h> <BR>#include "resource.h" <BR> <BR>LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam); <BR> <BR>//************************************************** ********************/ <BR>int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) <BR>{ <BR> DialogBox(hInst, MAKEINTRESOURCE( IDD_DIALOG1 ), NULL, DialogProc); <BR> return TRUE; <BR>} <BR>//************************************************** ********************/ <BR> <BR>LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam) <BR>{ <BR>// lokale Variable hier unterbringen <BR>switch (msg) <BR>{ <BR> case WM_INITDIALOG: <BR> // Initialisierungen hier eintragen <BR> break; <BR> case WM_COMMAND: <BR> // Beginn Nachrichtenschleife des Dialogs <BR> switch (LOWORD(wParam)) <BR> { <BR> case IDCANCEL: <BR> EndDialog(hDlg,TRUE); // Dialog beenden <BR> break; <BR> case IDOK: <BR> MessageBox(hDlg,"OK betätigt!","Nachricht an Benutzer",MB_OK); <BR> break; <BR> } <BR> break; <BR> // Ende Nachrichtenschleife des Dialogs <BR> case WM_DESTROY: <BR> // Ressourcen freigeben z.B. allozierter Speicher <BR> MessageBox(hDlg,"Empfange WM_DESTROY Nachricht","Nachricht an Benutzer",MB_OK); <BR> break; <BR> default: <BR> // nicht bearbeitete Nachrichten an Windows zurückgeben <BR> return FALSE; <BR> } <BR> return TRUE; <BR>} <BR>//************************************************** *********************/ <BR> <BR>Leeres Projekt erstellen, Code hineinkopieren (als .c), 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 -> 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 "...wohlgemerkt..."<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 "VC++ in 21 Tagen". 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 *.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 (Case ... ) oder die Nachricht wird ignoriert bzw. zurü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*{void}, "viel void, viel gut" Ctrl P, &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ür WIN XP umschreibe (mit der io.dll) 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++ durcheinandergewü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ünschten COM-Port.
Import-Script
20.03.2004, 22:29
Bringt leider nichts.
Import-Script
21.03.2004, 01:03
Für die serielle Schnittstelle unter Win9x/NT würde ich das auch nicht einsetzen. Dafür gibt es in VC Funktionen wie TransmitCommChar() (Einfach mal nach "Communications Functions" suchen). COMx Schnittstellen werden wie Dateien behandelt, also mit hCom = CreateFile("COM2", ..., ... ) geöffnet (hCom bekommt dann ein Handle). Die Funktionen besitzen vor allen Rü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 'turn off interrupts' in dem Beispiel. Ist nur was für DOS da Interrupts von Windows verwaltet werden (und sich zumindest XP auf diese Weise bestimmt nicht reinreden läßt). Die Parameter (Baudrate etc.) setzen sollte eigentlich auch mit IO.DLL gehen. Sehr hilfreich kann da auch ein einfacher RS-232 Protokoll Analyser (y-Kabel) und ein zweiter Rechner sein (siehe <a href="http://www.beyondlogic.org" target=_top>www.beyondlogic.org</a>, geht auch mit einer Win32 Terminalsoftware), denn irgendwie muß man ja auch definiert Zeichen auf die Schnittstelle geben können (vor allem bei µC Anbindungen sehr aufschlussreich). <BR> <BR>Zurück zum Beispiel. Dort wird ja das Line Status Register Bit 0 abgefragt, ob ein Zeichen eingetroffen ist. Um das zu überprüfen könnte man einmal nur dieses Register pollen (Endlosschleife abfragen) und gezielt mal ein Zeichen auf COMx senden (vielleicht geht das detektieren unter XP ja schon nicht). <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>
Powered by vBulletin® Version 4.1.7 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.