![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Parallelport ansprechen | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2008-01-29, 16:28 h Kaesebroetchen Posts: 643 User |
Hallo, ich möchte den Parallelport zu Bastelzwecken ansprechen. Ich versuche das zunächst mit diesem Code: C code:#include <stdio.h> #include <stdlib.h> #include <proto/exec.h> #include <devices/parallel.h> int main(int argc, char *argv[]) { struct IOExtPar * Parallelport; BYTE Rueckgabewert; printf("Öffne Parallelport...n"); Parallelport->io_ParFlags = PARF_SLOWMODE; Rueckgabewert = OpenDevice("parallel.device",0,Parallelport,0); if(Rueckgabewert == 0) { printf("Parallelport erfolgreich geöffnetn"); } else { printf("Ein Fehlercode wurde zurueckgegeben.n"); } CloseDevice(Parallelport); printf("Beliebige Taste zum beenden...n"); getchar(); return Rueckgabewert; } Kann mir jemand sagen was damit nicht stimmt ? OpenDevice sollte eigentlich 0 zurückgeben, tut es aber nicht. Ach ja, Betriebssystem ist AROS. -- http://amidevcpp.amiga-world.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 16:55 h thomas Posts: 7721 User |
@Kaesebroetchen:Zitat: Damit deklarierst du einen Pointer. Das ist eine Variable, die eine Adresse enthält. Da du keinen Wert zuweist, ist die Adresse undefinitert, also im besten Falle 0xBADC0DE und im schlimmsten Falle 0. Zitat: Damit schreibst du in den Speicher, auf den die Adresse zeigt plus den Offset von io_ParFlags. Ich kenne den Offset nicht, aber nehmen wir mal an, er wäre 0x124. Du schreibst also auf Adresse 0xBADC202. Da ist meistens kein RAM, sollte also zum Absturz führen. Im Fall von Adresse 0 schreibst du auf Adressse 0x124 und überschreibst irgendwas wichtiges, was da vorher stand. Wenn du mit Pointern arbeitest, solltest du dafür sorgen, daß sie nie uninitialisiert sind oder auf NULL stehen. Um einen IORequest anzulegen, solltest du CreateIORequest() benutzen. Vorher mußt du noch einen Reply-Port anlegen, dazu solltest du CreateMsgPort() nehmen. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 17:42 h Kaesebroetchen Posts: 643 User |
@thomas: Also erst mal danke für Hinweise. Ich habe das jetzt mal so abgeändert: C code:#include <stdlib.h> #include <proto/exec.h> #include <devices/parallel.h> int main(int argc, char *argv[]) { struct IOExtPar * Parallelport; struct MsgPort * ParallelMsgPort; Parallelport = CreateIORequest(ParallelMsgPort, sizeof(struct Message)); BYTE Rueckgabewert; ParallelMsgPort = CreateMsgPort(); printf("Öffne Parallelport...n"); Parallelport->io_ParFlags = PARF_SLOWMODE; Rueckgabewert = OpenDevice("parallel.device",0,Parallelport,0); if(Rueckgabewert == 0) { printf("Parallelport erfolgreich geöffnetn"); } else { printf("Ein Fehlercode wurde zurueckgegeben.n"); } CloseDevice(Parallelport); printf("Beliebige Taste zum beenden...n"); getchar(); return Rueckgabewert; } Funktioniert aber noch nicht. Hast du vielleicht einen Beispielcode für den Parallelport ? -- http://amidevcpp.amiga-world.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 17:51 h thomas Posts: 7721 User |
Zitat: Der gleiche Fehler wie eben: du benutzt den Port, bevor du ihn angelegt hast. Zitat: Und das ist ziemlicher Schwachsinn. Wie kommst du auf struct Message ? Wenn du einen IOExtPar anlegen möchtest, dann solltest du das auch in der Größe desselben tun. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 17:53 h thomas Posts: 7721 User |
Und eh ich es vergesse: Zitat: Alles, was du anlegst, mußt du auch wieder freigeben. Zu jedem Create... gehört ein Delete... Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 18:24 h Kaesebroetchen Posts: 643 User |
Zitat: Stimmt. Dummer Fehler. Zitat:Zitat: struct Message war in den Autodocs als Minimalgröße angegeben. Das die Größe die von IOExtpar sein muss, war für mich nicht so ersichtlich. Ich habe den code jetzt überarbeitet, aber immer noch kein Glück C code:--#include <stdio.h> #include <stdlib.h> #include <proto/exec.h> #include <devices/parallel.h> int main(int argc, char *argv[]) { struct IOExtPar * Parallelport; struct MsgPort * ParallelMsgPort; ParallelMsgPort = CreateMsgPort(); Parallelport = CreateIORequest(ParallelMsgPort, sizeof(struct IOExtPar)); BYTE Rueckgabewert; printf("Öffne Parallelport...n"); Parallelport->io_ParFlags = PARF_SLOWMODE; Rueckgabewert = OpenDevice("parallel.device",0,Parallelport,0); if(Rueckgabewert == 0) { printf("Parallelport erfolgreich geöffnetn"); } else { printf("Ein Fehlercode wurde zurueckgegeben.n"); } CloseDevice(Parallelport); DeleteMsgPort(ParallelMsgPort); DeleteIORequest(Parallelport); printf("Beliebige Taste zum beenden...n"); getchar(); return Rueckgabewert; } http://amidevcpp.amiga-world.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 20:23 h thomas Posts: 7721 User |
@Kaesebroetchen: Ich weiß nicht, welchen Compiler du benutzt, aber meiner (VBCC) meckert darüber, daß BYTE Rueckgabewert; nicht am Anfang steht. Bei C müssen alle Deklarationen am Anfang der Routine stehen. Ansonsten funktioniert der Code einwandfrei. Öffne Parallelport... Parallelport erfolgreich geöffnet Beliebige Taste zum beenden... Vielleicht solltest du etwas genauer beschreiben, was eigentlich passiert. "Kein Glück" ist nicht sehr aussagekräftig. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2008-01-29, 20:42 h Kaesebroetchen Posts: 643 User |
Zitat: Ich benutze AmiDevCpp als gcc. Zitat: Ich habe jetzt das ganze für 68k kompiliert und mal wieder WinUAE installiert. Mit diesem Code will das gute Stück sogar drucken. C code:#include <stdio.h> #include <stdlib.h> #include <proto/exec.h> #include <devices/parallel.h> int main(int argc, char *argv[]) { struct IOExtPar * Parallelport; struct MsgPort * ParallelMsgPort; BYTE Rueckgabewert; if(ParallelMsgPort = CreateMsgPort()) { if(Parallelport = (struct IOExtPar *) CreateIORequest(ParallelMsgPort, sizeof(struct IOExtPar))) { Parallelport->io_ParFlags = PARF_SHARED; } else {printf("CreateIORequest fehlgeschlagenn");} } else {printf("CreateMsgPort fehlgeschlagenn");} printf("Öffne Parallelport...n"); Rueckgabewert = OpenDevice("parallel.device",0L,(struct IORequest *)Parallelport,0); if(Rueckgabewert == 0) { printf("Parallelport erfolgreich geöffnetn"); } else { printf("Ein Fehlercode wurde zurueckgegeben.n"); } printf("Beliebige Taste zum Senden...n"); Parallelport->IOPar.io_Length = -1; Parallelport->IOPar.io_Data = (APTR)"Parallel lines cross 7 times..."; Parallelport->IOPar.io_Command = CMD_WRITE; DoIO((struct IORequest *)Parallelport); printf("Beliebige Taste zum beenden...n"); getchar(); CloseDevice((struct IORequest *)Parallelport); DeleteMsgPort(ParallelMsgPort); DeleteIORequest((struct IORequest *)Parallelport); printf("Beliebige Taste zum beenden...n"); getchar(); return Rueckgabewert; } Es liegt also wohl an AROS. Wirklich seltsam. Zitat: Na ja, OpenDevice schlug fehl. Der Rest klappt. Vielen Dank für deine Hilfe. -- http://amidevcpp.amiga-world.de/ [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Parallelport ansprechen | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |