SetCommMask()

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Reza
    Medlem
    • 2001-02-27
    • 111

    #1

    SetCommMask()

    Hej

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

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

    "Keep things as simple as possible, but not simpler"

  • PeW
    Medlem
    • 2000-06-20
    • 6839

    #2
    OS?

    Comment

    • Reza
      Medlem
      • 2001-02-27
      • 111

      #3
      XP
      "Keep things as simple as possible, but not simpler"

      Comment

      • niko
        Avregistrerad
        • 2002-06-16
        • 2415

        #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å-APIr 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.

        Comment

        • Reza
          Medlem
          • 2001-02-27
          • 111

          #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?
          "Keep things as simple as possible, but not simpler"

          Comment

          • Beatbox
            Medlem
            • 2001-10-05
            • 2496

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

            [kod]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.
            }
            [/kod]
            - BeatBox

            Comment

            • Reza
              Medlem
              • 2001-02-27
              • 111

              #7
              Det fungerar med COM1, men inte med LPT1
              "Keep things as simple as possible, but not simpler"

              Comment

              • Beatbox
                Medlem
                • 2001-10-05
                • 2496

                #8
                Det här då ?

                [kod] // 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;
                }
                [/kod]
                - BeatBox

                Comment

                • Reza
                  Medlem
                  • 2001-02-27
                  • 111

                  #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?
                  "Keep things as simple as possible, but not simpler"

                  Comment

                  • Beatbox
                    Medlem
                    • 2001-10-05
                    • 2496

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

                    Comment

                    • Reza
                      Medlem
                      • 2001-02-27
                      • 111

                      #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
                      "Keep things as simple as possible, but not simpler"

                      Comment

                      • niko
                        Avregistrerad
                        • 2002-06-16
                        • 2415

                        #12
                        [citat="Reza"]
                        Jag använder en hjälp driver,
                        [/citat]

                        OK. Vilken använder du?

                        [citat="Reza"]
                        Men hur kan min app bli notifierad om inkommande data på porten.
                        [/citat]

                        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:



                        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å?
                        Last edited by niko; 2002-12-07, 10:12.

                        Comment

                        • Beatbox
                          Medlem
                          • 2001-10-05
                          • 2496

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

                          Comment

                          • Reza
                            Medlem
                            • 2001-02-27
                            • 111

                            #14
                            Som jag skriver ovan använder jag mig av en dll (io.dll).
                            Jag har bifogat readme filen som följer med.
                            Attached Files
                            "Keep things as simple as possible, but not simpler"

                            Comment

                            • niko
                              Avregistrerad
                              • 2002-06-16
                              • 2415

                              #15
                              [citat="Reza"]
                              Som jag skriver ovan använder jag mig av en dll (io.dll).
                              [/citat]

                              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.

                              Comment

                              Working...