Avatar billede ibhansen Nybegynder
22. februar 2004 - 19:47 Der er 24 kommentarer og
1 løsning

Skriv og læs til LPT1

Jeg forsøger at lave et program der kan skrive og læse fra LPT1, meningen er at 2 pc'er skal være forbundet via parallel porten, og kunne skriver til hinanden. Jeg har fået at vide at jeg skal oprette forbindelse til LPT1 via createFile, men kan ik helt få det til at virke, her er hvad jeg har:

#include <fstream>
#include <winbase.h>
#include <windows.h>

using namespace std;

int main()
{
HANDLE fil;
fil = CreateFile ('\\.\LPT1',
FILE_ALL_ACCESS,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

system("PAUSE");
return 0;
}


Hvis jeg for CreateFile til at virke, skal jeg vel bare bruge writeFile, og Readfile for at læse og skrive til LPT1?

Jeg bruger dev-cpp.
Avatar billede arne_v Ekspert
22. februar 2004 - 19:49 #1
Skal det ikke være:

fil = CreateFile ("LPT1:",

?
Avatar billede arne_v Ekspert
22. februar 2004 - 19:50 #2
Og ja - WriteFile og ReadFile lyder rigtige.
Avatar billede ibhansen Nybegynder
22. februar 2004 - 20:57 #3
Nu kommer der i hvertfald ingen fejl mere, er der en måde jeg kan checke om det virker, om den har kontakt til LPT1?

jeg roder lidt med read-, og writeFile, skriver nok igen, der skal nok komme flere felj.
Avatar billede arne_v Ekspert
22. februar 2004 - 20:59 #4
Hvis den fejler så returnerer CreateFile INVALID_HANDLE_VALUE !
Avatar billede ibhansen Nybegynder
22. februar 2004 - 21:05 #5
ok, så hvis jeg kan kompilere ovenstående kode, bare med ("LPT1:" i stedet for det gamle, så virker det? eller skal man bruge den der getlasterror() ?
Avatar billede arne_v Ekspert
22. februar 2004 - 21:07 #6
Du tester:

if(fil==INVALID_HANDLE_VALUE)
{
  // houston we have a problem
}
Avatar billede ibhansen Nybegynder
22. februar 2004 - 21:38 #7
Ok, så burde det virke, takker.
Avatar billede arne_v Ekspert
22. februar 2004 - 21:40 #8
Jeg ligger et svar for det så, men vent med at acceptere indtil WriteFile og
ReadFile virker.
Avatar billede ibhansen Nybegynder
23. februar 2004 - 11:49 #9
Er der ik en der kan hjælpe mig med det der pointer ting, kan ik finde ud af det. (Problemet ligger under writefile) skal lave en pointer til variablen tekst, og sådan lidt...

#include <fstream>
#include <winbase.h>
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
string tekst; //det der skal sendes
cout << "indtast data, som skal sendes" << endl;
cin >> tekst;

HANDLE fil;
fil = CreateFile ("LPT1:",
GENERIC_WRITE,             
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

if(fil==INVALID_HANDLE_VALUE)
{
cout << "Fejl i CreateFile" << endl;
}

BOOL WriteFile(
HANDLE "LPT1:",
LPCVOID lpBuffer,   
DWORD 1,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);

system("PAUSE");
return 0;
}
Avatar billede arne_v Ekspert
23. februar 2004 - 11:55 #10
BOOL WriteFile(
HANDLE "LPT1:",
LPCVOID lpBuffer,   
DWORD 1,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);

skal vel være:

char buf[] = "Dette er en prøve";
long nb;
BOOL res = WriteFile(
fil,
buf,   
strlen(buf),
&nb,
NULL
);
Avatar billede ibhansen Nybegynder
23. februar 2004 - 12:21 #11
#include <fstream>
#include <winbase.h>
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
string tekst; //det der skal sendes
cout << "indtast data, som skal sendes" << endl;
cin >> tekst;

HANDLE fil;
fil = CreateFile ("LPT1:",
GENERIC_WRITE,             
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

if(fil==INVALID_HANDLE_VALUE)
{
cout << "Fejl i CreateFile" << endl;
}

char buf[] = "Dette er en proeve";
long nb;
BOOL res = WriteFile(
fil,
buf,   
strlen(buf),
&nb,
NULL
);

system("PAUSE");
return 0;
}


Altså sådan der? så laver den fejl når jeg prøver at kompilere den, den siger "invalid conversation for 'long int*' to´"
Avatar billede arne_v Ekspert
23. februar 2004 - 12:44 #12
Så husker jeg forkert med hvad DWORD er.

Erstat

long nb;


med

DWORD nb;
Avatar billede ibhansen Nybegynder
23. februar 2004 - 14:49 #13
Der kommer inge fejl mere, men jeg er ik 100 på at det virker, den hænger lidt, dvs. den kommer aldrig til system("pause"); Men det er måske fordi jeg ik har koblet pc'erne sammen?
Avatar billede arne_v Ekspert
23. februar 2004 - 14:57 #14
Måske...

Du bliver nødt til at prøve at koble dem sammen.
Avatar billede ibhansen Nybegynder
23. februar 2004 - 15:37 #15
Det prøver jeg så, men det blvier først i morgen, skal også først have lavet readfile, hvis jeg kan finde ud af det:D
Avatar billede arne_v Ekspert
23. februar 2004 - 18:47 #16
Den ligner WriteFile en del.
Avatar billede ibhansen Nybegynder
24. februar 2004 - 10:53 #17
Har prøvet at sætte pc'erne sammen i dag, men detvirker desværre ikke. Programmet der skal sende hænger stadig, og jeg er ik helt sikkert på at readFile er rigtig.

send:

#include <fstream>
#include <winbase.h>
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
HANDLE fil;
fil = CreateFile ("LPT1:",
GENERIC_WRITE,             
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

if(fil==INVALID_HANDLE_VALUE)
{
cout << "Fejl i CreateFile" << endl;
}

char buf[] = "t";
DWORD nb;
BOOL res = WriteFile(
fil,
buf,   
strlen(buf),
&nb,
NULL
);

system("PAUSE");
return 0;
}

modtager:

#include <fstream>
#include <winbase.h>
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
int kaj = 1;

HANDLE fil;
fil = CreateFile ("LPT1:",
GENERIC_WRITE,             
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

if(fil==INVALID_HANDLE_VALUE)
{
cout << "Fejl i CreateFile" << endl;
}

do
{
char buf[1];
DWORD nb;
BOOL res = ReadFile(
fil,
buf,   
strlen(buf),
&nb,
NULL
);

cout << buf << endl;
if(fil==0)
{
cout << "Fejl i ReadFile" << endl;
}

}
while (kaj==1);

}
Avatar billede coldplay Nybegynder
25. februar 2004 - 01:06 #18
Du bør droppe FILE_FLAG_OVERLAPPED parameteren, hvis der ikke er nogen andre processer involveret end simpel kommunikation mellem programmerne på hver PC.
Avatar billede coldplay Nybegynder
26. februar 2004 - 01:46 #19
-->ibhansen

Jeg vil godt hjælpe dig.

FILE_FLAG_OVERLAPPED parameteren kræver en såkaldt "OVERLAPPED" structure, som bruges i forb. med asynkron kommunikation. Denne type kommunikation kan f.eks være med en parallel port, hvor den asynkrone kommunikation kører som en baggrundsproces, der er uafhængig af hovedprocessen (programmet). Den kommunikationsform du vil benytte er synkron, dvs. programmets videre forløb er temmelig afhængig af, om datastrømmen ud af eller ind i porten er afsluttet eller ej. Dette er ikke tilfældet med asynkron kommunikation.

Kaldes WriteFile med FILE_FLAG_OVERLAPPED parameteren uden en (gyldig) OVERLAPPED structure, så sker der det, du har set: programmet hænger.

Svar udbedes :-D
Avatar billede ibhansen Nybegynder
26. februar 2004 - 17:31 #20
Lyder da meget fornuftigt, det må jeg jo lige prøve at ændre så.

Grunden til der nogen gange går lidt i mellem at jeg svare er pga. at det er et skole projekt, har derfor ik rodet med det i et par dage, og synes ikke der var grund til at skrive, uden egengtligt at have noget at sige. har først mulighed for at kigge på det igen på mandag, men så skal jeg nok skrive igen, for jeg laver nok noget andet skidt:D
Avatar billede coldplay Nybegynder
27. februar 2004 - 01:19 #21
Tak for din respons.

Jeg poster noget kode i løbet af weekenden.

:-)
Avatar billede coldplay Nybegynder
29. februar 2004 - 13:07 #22
Koden til afsender siden:

/* SEND TIL <PC 2> LPT PORT */
    HANDLE file_out;
    DWORD bytes_written;
    char buffer_out[] = "Dette er en test streng!";
    bool isWritten;
    // udskriv til skærm
    file_out = CreateFile(
        "CONOUT$",    // erstattes med "LPT1:"
        GENERIC_WRITE,
        NULL,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    if(file_out == INVALID_HANDLE_VALUE){
        printf("***UGYLDIG HANDLE***");
        ExitProcess(1);
    }
    isWritten = WriteFile(
        file_out,
          &buffer_out,
          sizeof(buffer_out),
          &bytes_written,
          NULL
    );
    if(!isWritten){
        printf("***OUTPUT TIL LPT FEJL***");
        ExitProcess(1);
    }
    CloseHandle(file_out);
Avatar billede coldplay Nybegynder
29. februar 2004 - 13:09 #23
Koden til modtager siden:

/* LÆS FRA <PC 1> LPT PORT */
    HANDLE file_in;
    DWORD bytes_read;
    char buffer_in[80];
    bool isRead;
    bool doLoop = true;

    file_in = CreateFile(
        "LPT1:",
        GENERIC_READ,                             
        NULL,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    if(file_in == INVALID_HANDLE_VALUE){
        printf("***UGYLDIG HANDLE***");
        ExitProcess(1);
    }
    do{
        isRead = ReadFile(
            file_in,
              &buffer_in,
              sizeof(buffer_in),
              &bytes_read,
              NULL
            );
            if(isRead){
                /*
                    hvis ReadFile returnerer "true" OG bytes_read = 0
                    så er strengen fra <PC 1> modtaget af <PC 2>
                */
                if(isRead && bytes_read == 0){
                    printf("%s", buffer_in);
                    doLoop = false; // hop ud af loop
                }
            }
            else{
                printf("***DATA IKKE MODTAGET****");
                doLoop = false; // hop ud af loop
            }
    }while(doLoop);
    CloseHandle(file_in);

Start "afsender" op først, dernæst "modtager".

Afsender vil formentlig hænge indtil modtager kører.

Hvis modtager viser tekststrengen, så er udveksling af data mulig, men kun den ene vej.

Data begge veje er så næste skridt, men det kræver en eller anden form for flowkontrol.

Prøv koden og kom med en kommentar :-)
Avatar billede ibhansen Nybegynder
11. marts 2004 - 22:50 #24
Har desværre haft travlt med noget andet, og er færdig med skolen nu, så jeg har ikke mulighed for at afprøve det. Beklager meget at jeg måske har spildt jeres tid.

Kan man dele pointene mellem jer? eller skal man give det hele til en?
Avatar billede arne_v Ekspert
11. marts 2004 - 22:53 #25
Man kan godt dele point.

Sørg for at alle der skal have har lagt svar.

Marker navnene (gør dem blå).

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