webForumDet fria alternativet

SetCommMask()

C/C++

51 svar · 1 983 visningar · startad av Reza

Medlem sedan feb. 2001107 inlägg
Frågan#1

Hej

Varför fungerar inte GetCommMask() eller SetCommMask() med LPT1??

Hur kan en app bli notifierad om inkommande data på LPT1??

:q

Medlem sedan juni 200010 432 inlägg
#2

OS?

Medlem sedan feb. 2001107 inlägg
#3

XP

Medlem sedan juni 20022 599 inlägg
#4

Om man får tro vad dom här killarna säger så kan man inte göra det du vill med högnivå-API:er på NT/2000/XP.

Antingen får du skriva en egen driver eller använda en befintlig hjälp-driver. Med andra ord, tillbaka till din andra tråd: http://www.webforum.nu/showthread.php?s=&threadid=59815.

En tredje option är att byta OS till 9x.

Medlem sedan feb. 2001107 inlägg
#5

Jag använder en hjälp driver, så det fungerar att skriva till och läsa av porten direkt.
Men hur kan min app bli notifierad om inkommande data på porten.
Jag vill ju inte ligga i en loop och kolla detta hela tiden, eller?

Medlem sedan okt. 20013 217 inlägg
#6

Jag hittade ett exempel i PlatformSDK:n. Har du testat om detta funkar ?

HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,    // exclusive access 
    NULL, // no security attributes 
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );

if (hCom == INVALID_HANDLE_VALUE) 
{
    // Handle the error. 
    return;
}

// Set the event mask. 

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess) 
{
    // Handle the error. 
    return;
}

// Create an event object for use in WaitCommEvent. 

o.hEvent = CreateEvent(
    NULL,   // no security attributes 
    FALSE,  // auto reset event 
    FALSE,  // not signaled 
    NULL    // no name 
    );

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
{
    if (dwEvtMask & EV_DSR) 
    {
         // To do.
    }

    if (dwEvtMask & EV_CTS) 
    {
         // To do. 
    }
Medlem sedan feb. 2001107 inlägg
#7

Det fungerar med COM1, men inte med LPT1

Medlem sedan okt. 20013 217 inlägg
#8

Det här då ?

      // RawDataToPrinter - sends binary data directly to a printer
      // 
      // szPrinterName: NULL-terminated string specifying printer name
      // lpData:        Pointer to raw data bytes
      // dwCount        Length of lpData in bytes
      // 
      // Returns: TRUE for success, FALSE for failure.
      // 
       BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
      {
        HANDLE     hPrinter;
        DOC_INFO_1 DocInfo;
        DWORD      dwJob;
        DWORD      dwBytesWritten;

        // Need a handle to the printer.
        if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
          return FALSE;

        // Fill in the structure with info about this "document."
        DocInfo.pDocName = "My Document";
        DocInfo.pOutputFile = NULL;
        DocInfo.pDatatype = "RAW";
        // Inform the spooler the document is beginning.
        if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0 )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Start a page.
        if( ! StartPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Send the data to the printer.
        if( !WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
        {
          EndPagePrinter( hPrinter );
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // End the page.
        if( ! EndPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Inform the spooler that the document is ending.
        if( ! EndDocPrinter( hPrinter ) )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }
        // Tidy up the printer handle.
        ClosePrinter( hPrinter );
        // Check to see if correct number of bytes were written.
        if( dwBytesWritten != dwCount )
          return FALSE;
        return TRUE;
      }
Medlem sedan feb. 2001107 inlägg
#9

Det här är ju till för skrivar drivrutiner, jag vill inte communicera med en skrivare.

Kan WaitForMultipleObjectsEx vara något om den används i samband med ReadFileEx?

Medlem sedan okt. 20013 217 inlägg
#10

För att styra LPT1 på "detaljnivå" så måste du skriva en egene drivrutin.

Medlem sedan feb. 2001107 inlägg
#11

Jag har nog tyvärr varit lite otydlig i min beskrivning, alltså; jag KAN styra LPT porten på låg nivå, men hur kan jag få reda på att det finns data att läsa av på porten?

Finns det kanske några WM meddelande typ: WM_LäsAvLpt :)

Medlem sedan juni 20022 599 inlägg
#12

Reza skrev:

Jag använder en hjälp driver,

OK. Vilken använder du?

Reza skrev:

Men hur kan min app bli notifierad om inkommande data på porten.

Spekulerar nu eftersom jag aldrig kodat mot parallellporten, men på nåt sätt så måste din "hjälp-driver" också tillåta dig att ta över interrupts, skulle jag tro.

Här finns ett parallellports-toolkit som verkar göra det:

http://www.entechtaiwan.com/tviclpt.htm

Den kostar pengar men, finns som "fully functional demo". Har för mig att begränsningen består i att den skriver små irriterande meddelanden till event-loggen, inget mer. Kanske värt att titta på?

Medlem sedan okt. 20013 217 inlägg
#13

Hur lyckas du styra LPT1 från XP utan att behandla den som en printerport ?

Medlem sedan feb. 2001107 inlägg
#14

Som jag skriver ovan använder jag mig av en dll (io.dll).
Jag har bifogat readme filen som följer med.

Medlem sedan juni 20022 599 inlägg
#15

Reza skrev:

Som jag skriver ovan använder jag mig av en dll (io.dll).

Ja. Och den installerar en driver som heter "io.sys" som ger dig direkt access till läsningar och skrivningar mot porten. Men frågan är om den ger dig access till interrupts/events? Jag hittar inget i hjälpfilen som tyder på det.

Medlem sedan juni 20022 599 inlägg
#16

BTW: Har du provat giveio.sys? Den är inte specifik för att läsa mot LTP1 utan ger generell hårdvaruaccess. Eventuellt kunde alltså din SetCommMask-kod funka när den är laddad? (Nu spekulerar jag.) Men det är iaf den killarna i tråden jag länkade till pratar om (andra inlägget).

http://www.experts-exchange.com/Programming/Programming_Platforms/Win_Prog/Q_10016985.html

Medlem sedan feb. 2001107 inlägg
#17

Jag har laddat ner giveio och installerat det, men det fungerar inte.
Jag får INVALID_HANDLE_VALUE.

h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Med min dll fil kan jag ju som bekant läsa av porten direkt, kan jag loopa och se när det finns något att läsa???

Medlem sedan aug. 2001458 inlägg
#18

Vad returnerar GetLastError() när CreateFile() felat?

Är drivrutinen startad? Använd sc.exe för att kontrollera drivrutinen - "sc query giveio", "sc start giveio" och "sc stop giveio" borde fungera.

Medlem sedan aug. 2001458 inlägg
#19

Jag tror att USBLPTPD11.SYS är något för dig. Det verkar som den stöder asynkron IO från parallellporten. Då borde du kunna göra en ioctl med IOCTL_WAIT_INTERRUPT, och skicka med en overlapped-struktur med ett event som du sedan väntar på med WaitForSingleObject, så signalerar drivern eventet när data kommer på porten. Då kan du göra läsningen.

(jag är inte alls säker på att jag har rätt...)

Medlem sedan feb. 2001107 inlägg
#20

developer, jag har suttit med det här problemet i flera dag nu (sovit bara några timmar).
Vill du vara så snäll och skriva ett exempel på hur jag väntar på inkommande data och hur jag läser det med hjälp av USBLPTPD11.SYS.
Får jag det här att funka nu kan jag sova ikväll…

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)