amiga-news 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:
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/

[ - 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:
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/

[ - Answer - Quote - Direct link - ]

2008-01-29, 17:53 h

thomas
Posts: 7721
User

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/

[ - Answer - Quote - Direct link - ]

2008-01-29, 18:24 h

Kaesebroetchen
Posts: 643
User
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/

[ - 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:
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/

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