Avatar billede ng-km Nybegynder
28. januar 2003 - 21:31 Der er 9 kommentarer og
1 løsning

Send byte/bits til parallelporten....

Jeg har via Java´s comm-API fået mulighed for at kommunikere med med min parallelport, men kan ikke helt få det til at virke.

Jeg har en optokobler tilsluttet porten, og sat en diode på hvert data-ben (2-9), og ideen er at jeg ved at sende en defineret byte, kan tænde/slukke for hver enkelt diode uafhængig af de andre.

Det følgende program kan sende data til porten, og kan tænde/slukke for de 8 ben alt efter hvad der sendes af 1-taller og nuller.

Problemet er bare at jeg ikke kan sende data til porten hvis min optokobler er tilsluttet. Jeg kan heller ikke sende data til porten uden nogen printer tilsluttet, altså til en port uden noget tilsluttet.

Hvis jeg imidlertid sætter min printer(kun når den er tændt)til porten kan jeg se at der bliver sendt data, ved efterfølgende at flyttet printerkablet over på min optokobler, så tænder forskellige dioder alt efter hvad der er sendt til printeren. Programmet terminerer også korrekt ved printertilslutning.

Uden min printer når jeg ikke længere end til mit write(..)-statement i koden, så hænger programmet der og venter. Hvordan kan jeg sende en byte direkte til min optokobler uden at skulle sende til printeren først og derefter flytte kablet for at se hvilken byte der er sendt(det er lidt trivielt i længden)? Det er som om porten venter på et udefra kommende signal før den vil sende, men hvad er det printeren gør som min optokobler eller en "tom" port ikke gør.

Der fulgte et lille c++ program med optokobleren. Det kan tænde og slukke hver diode som jeg ønsker det, så det er ikke computeren/porten det er galt med. Jeg vil bare gerne have det til at virke med et java-program også.


import java.util.*;
import javax.comm.*;
import java.io.*;

class Start
{

    public static void main(String args[])
    {
        // 1 byte/otte bits ->  1 = tændt  0 = slukket
        String binNumber = ("11111111");
       
        try
        {
            //fang LPT1 porten
            CommPortIdentifier commId = CommPortIdentifier.getPortIdentifier("LPT1");
           
            //hvem har porten nu
            System.out.println("Owner of Port  " + commId.getCurrentOwner());
           
            //Snup porten til dig selv, åbn den, og lav den til et commport-objekt
            ParallelPort parport = (ParallelPort)commId.open("My port", 1000);

            //hvem har porten nu (dig selv forhåbentlig)
            System.out.println("Owner of port  " + commId.getCurrentOwner());
           
            //lav en outstream du kan skrive til
            OutputStream outstream = parport.getOutputStream();
           
            //skriv en byte til din outstream
            outstream.write(Integer.valueOf(binNumber, 2).intValue());
            //tøm din outstream
            outstream.flush();
            //og luk den
            outstream.close();
            //luk din port igen
            parport.close();
           
            System.exit(0);
        }
        catch(NoSuchPortException e)
        {System.out.println("NoSuchPortException");}
        catch(PortInUseException e)
        {System.out.println("PortInUseException");}
        catch(IOException e)
        {System.out.println("IOException");}
   
    }//main
}//class
Avatar billede disky Nybegynder
29. januar 2003 - 07:37 #1
Jeg er ikke sikker, men jeg gætter på problematikken skyldes du ikke snakker direkte med parallelporten men til parallelporten via printerdriveren.

Dette gør at der nok skal en form for handshaking til fra printerens side.

Under linux er det rimeligt nemt da parallel porten bare er en 'fil' du skriver til. Under windows er det noget mere besværligt da du her skal have en kernel mode driver.

Men kig evt: http://www.geocities.com/Juanga69/parport/

De har så vidt jeg lige kan bedømme lavet sådanne en driver og gjort det muligt at snakke direkte med porten.
Avatar billede ng-km Nybegynder
29. januar 2003 - 14:16 #2
Disky >> Jeg har prøvet softwaren på linket, og har fået det til at virke bedre end jeg kunne med SUN's comm-api. Problemet med det nye er at jeg ikke er sikker på at jeg kan læse fra porten ud over de almindelige status-indikeringer(paper-out osv.). Det betyder at jeg kun kan lave en simplex-protokol og jeg vil som minimum gerne have mulighed for en halv-duplex og helst en fuld duplex.

Jeg lader spørgsmålet stå åbent lidt endnu, men hvis der ikke kommer andre på banen med noget bedre er pointene dine.
Avatar billede disky Nybegynder
29. januar 2003 - 15:03 #3
Parallel porten er simplex, dog kan du ændre retningen af den.

Om deres driver understøtter dette kan jeg dog ikke svare på.
Avatar billede disky Nybegynder
29. januar 2003 - 15:11 #4
jeg mente man kunne ændre retning på den, men jeg bliver ærligt talt i tvivl, jeg tror faktisk den er implementeret som envejs på en PC'er
Avatar billede disky Nybegynder
29. januar 2003 - 15:13 #5
Men med lidt fix elektronik på porten, kan du klare det, okay du har kun 5 bit indad og 8 ud, men lidt multiplexing kan også løse dette problem.
Avatar billede ng-km Nybegynder
29. januar 2003 - 21:06 #6
Som tingene er lige nu er jeg glad for bare at kunne tænde og slukke mine dioder, men det varer ikke ved længe. Derfor er mit næste skridt selvfølgelig at få eksternt udstyr til at svare på en forespørgsel, og du har ret i at jeg er hjulpet et godt stykke med mine tilgængelige 5 bit. Men jeg har læst et sted at en parallelport der er sat op som Standard Parallel Port (SPP) er "bidirectional", og at ben 18-25 udover at være nul kan benyttes som databærende og derved opnå fuld duplex. Java vil kun lade mig sætte porten til SPP, så det er jo godt nok.

Alt det er naturligvis ud over dette spørgsmål, men jeg håber at andre måske også vil blande sig, så jeg kan få belyst Java's, måske, begrænsede forhold til parallelporten.
Avatar billede disky Nybegynder
30. januar 2003 - 08:08 #7
hmmmm, jeg prøver at grave lidt videre.
Avatar billede zeed Nybegynder
11. september 2003 - 11:44 #8
Hejsa

Jeg ville bare høre hvilken optokobler du har købt og hvor og hvad den koster?

mvh
Avatar billede ng-km Nybegynder
11. september 2003 - 17:13 #9
Avatar billede zeed Nybegynder
12. september 2003 - 09:09 #10
Takker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester