ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Parallelport ansprechen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
29.01.2008, 16:28 Uhr Kaesebroetchen Posts: 643 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 16:55 Uhr thomas Posts: 7718 Nutzer |
@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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 17:42 Uhr Kaesebroetchen Posts: 643 Nutzer |
@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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 17:51 Uhr thomas Posts: 7718 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 17:53 Uhr thomas Posts: 7718 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 18:24 Uhr Kaesebroetchen Posts: 643 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 20:23 Uhr thomas Posts: 7718 Nutzer |
@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/ [ - Antworten - Zitieren - Direktlink - ] |
29.01.2008, 20:42 Uhr Kaesebroetchen Posts: 643 Nutzer |
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/ [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Parallelport ansprechen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |