amiga-news 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:
struct IOExtPar * Parallelport;

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:
Parallelport->io_ParFlags = PARF_SLOWMODE;

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:
Parallelport = CreateIORequest(ParallelMsgPort, sizeof(struct Message));

ParallelMsgPort = CreateMsgPort();


Der gleiche Fehler wie eben: du benutzt den Port, bevor du ihn angelegt hast.

Zitat:
CreateIORequest(..., sizeof(struct Message))

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:
CloseDevice(Parallelport);
printf("Beliebige Taste zum beenden...n");
getchar();
return Rueckgabewert;


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:
Original von thomas:
Zitat:
Parallelport = CreateIORequest(ParallelMsgPort, sizeof(struct Message));

ParallelMsgPort = CreateMsgPort();


Der gleiche Fehler wie eben: du benutzt den Port, bevor du ihn angelegt hast.


Stimmt. Dummer Fehler.

Zitat:
Zitat:
CreateIORequest(..., sizeof(struct Message))

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


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:
Original von thomas:
@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.


Ich benutze AmiDevCpp als gcc.

Zitat:
Ansonsten funktioniert der Code einwandfrei.

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:
Vielleicht solltest du etwas genauer beschreiben, was eigentlich passiert. "Kein Glück" ist nicht sehr aussagekräftig.

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.
.