OS?
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
51 svar · 1 983 visningar · startad av Reza
Hej
Varför fungerar inte GetCommMask() eller SetCommMask() med LPT1??
Hur kan en app bli notifierad om inkommande data på LPT1??
:q
OS?
XP
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.
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?
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.
}
Det fungerar med COM1, men inte med LPT1
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;
}
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?
För att styra LPT1 på "detaljnivå" så måste du skriva en egene drivrutin.
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 :)
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å?
Hur lyckas du styra LPT1 från XP utan att behandla den som en printerport ?
Som jag skriver ovan använder jag mig av en dll (io.dll).
Jag har bifogat readme filen som följer med.
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.
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
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???
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.
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...)
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…