comport: pins in C++ auslesen



  • Hallo,

    ich muss für ein aktuelles Projekt auf den Comport (aka LPT, Serielle Schnittstelle) zugreifen und die Pins 4,6 oder 7,8 auslesen, bzw. monitoren.
    Wie mach ich das korrekt in C++? Ich habe mir schon asio angesehen, das scheint aber eher für Datentransfer als für das Ansprechen einzelner Pins gedacht zu sein.
    Da ich nichts senden muss, wäre mir am liebsten, wenn es einen Callback gäbe, den man registrieren kann.

    Kann mir jemand anhaltpunkte geben? Wie muss ich das machen?
    Ich habe schon diverse Dinge über Google gefunden, aber da wird meistens nur vom Lesen/Senden über den Comport geschrieben, nicht von einzelnen Pins.

    phlox



  • hi

    vielleicht hilft dies hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39312-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    (vor allem ab seite 2)

    mynona und AJ haben einiges dazu erklärt.

    würde weiter im wahrscheinlich windows? forum fragen, da nicht standard 😉

    greets



  • phlox81 schrieb:

    ich muss für ein aktuelles Projekt auf den Comport (aka LPT, Serielle Schnittstelle) zugreifen

    LPT ist doch der druckerport (parallelschnittstelle).

    phlox81 schrieb:

    und die Pins 4,6 oder 7,8 auslesen, bzw. monitoren.

    damit: http://msdn.microsoft.com/en-us/library/aa363435(VS.85).aspx
    damit: http://msdn.microsoft.com/en-us/library/aa363257(VS.85).aspx
    und damit: http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx
    kannst du ein paar steuerleitungen der RS232 abfragen (unter windoofs).
    🙂



  • elise schrieb:

    hi

    vielleicht hilft dies hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39312-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    (vor allem ab seite 2)

    mynona und AJ haben einiges dazu erklärt.

    würde weiter im wahrscheinlich windows? forum fragen, da nicht standard 😉

    greets

    Oh, vielen Dank, das hilft mir schon mal weiter. Die Klasse muss ich auch mal ausprobieren, leider habe ich hier nichts um das ernsthaft testen zu können.

    @fricky

    ja, da hast du recht. Ist beides aber verwandt, auch wenn ich nur die 9 Pinnige version benötige.
    Die Links sind auch gut, aber ich glaube das macht alles schon die Klasse von AJ aus Elises link.

    Ich muss wohl nur CTS und DSR abfragen, wenn ich das so richtig verstanden habe. Werde das zumindest austesten.
    Noch eine Frage, das polling muss ich dann selber machen, also alle x ms eine Abfrage, oder gibts da evtl. schon was?

    phlox



  • phlox81 schrieb:

    @fricky
    ja, da hast du recht. Ist beides aber verwandt

    absolut nicht.

    phlox81 schrieb:

    Noch eine Frage, das polling muss ich dann selber machen, also alle x ms eine Abfrage, oder gibts da evtl. schon was?

    was hast du gegen polling?
    aber keine angst: http://msdn.microsoft.com/en-us/library/aa363479(VS.85).aspx
    🙂



  • ~fricky schrieb:

    phlox81 schrieb:

    Noch eine Frage, das polling muss ich dann selber machen, also alle x ms eine Abfrage, oder gibts da evtl. schon was?

    was hast du gegen polling?
    aber keine angst: http://msdn.microsoft.com/en-us/library/aa363479(VS.85).aspx
    🙂

    Naja, polling wäre ok, extra thread+timer. Aber ich würde halt lieber das direkt als Callback haben.
    WaitCommEvent ist ja schon mal ein Ansatz, gibts das evtl. schon in eine Monitorklasse gewrappt, die einen Callback zur Verfügung stellt?
    WaitCommEvent müsste man ja in einer art Schleife immer wieder aufrufen.

    phlox



  • phlox81 schrieb:

    WaitCommEvent ist ja schon mal ein Ansatz, gibts das evtl. schon in eine Monitorklasse gewrappt, die einen Callback zur Verfügung stellt?

    keine ahnung, obs sowas irgendwo fertig gibt. vielleicht da: http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503
    ansonsten könntest du z.b. einen extra thread starten, der in WaitCommEvent festhängt und wenn WaitCommEvent zurückkommt, eine WM_USER+xxx -message an deine windows-anwendung schickt (als callback-ersatz sozusagen). mit dem verfahren hättest du dich auch gleich vom warte-thread entkoppelt.

    btw: lass dich nach winapi verschieben. hier ist nicht der richtige ort für sowas.
    🙂



  • Habe hier ein Beispiel gefunden.
    Das werde ich wohl zum Testen in ein wxThread portieren, da ich dort auch WaitForSingleObject nutzen kann.
    Und dann wird jeweils ein Event geworfen, fertig. Das Programm soll später eh unter wxWidgets laufen.

    Frage mich jetzt aber, wie und ob man das auch mit boost::thread noch umsetzen könnte.

    phlox



  • phlox81 schrieb:

    Habe hier ein Beispiel gefunden.

    ^^genau so meinte ich das.

    phlox81 schrieb:

    Frage mich jetzt aber, wie und ob man das auch mit boost::thread noch umsetzen könnte.

    warum nicht? die boost-zeug ist doch open soutrce, ne? dann kannt du's ja umbauen, so dass es passt.
    🙂



  • ~fricky schrieb:

    phlox81 schrieb:

    Habe hier ein Beispiel gefunden.

    ^^genau so meinte ich das.

    phlox81 schrieb:

    Frage mich jetzt aber, wie und ob man das auch mit boost::thread noch umsetzen könnte.

    warum nicht? die boost-zeug ist doch open soutrce, ne? dann kannt du's ja umbauen, so dass es passt.
    🙂

    Nein, ich will da nix umbauen. Ich würde einfach gerne wissen, wie ich das dann mit boost::thread machen würde.
    boost::thread::condition oder so vermute ich. Aber konkret habe ich da noch nix gefunden.
    Abgesehen davon, das ich es wahrscheinlich sowieso mit wx mache, da ich dann direkt das über einen Event regeln kann.

    phlox



  • Hm, das Thema ist leider wieder aktuell.

    Ich empfange keine Events. Und ich weiss auch nicht, ob das die richtige Methode ist.

    Ich muss feststellen, ob zwischen den Pins 4,6 oder 7,8 strom fließt, sonst nichts.
    Bisher bin ich davon ausgegangen das das EV_CTS und EV_DSR dies abdecken, da pin 6 DSR und Pin8 CTS ist.

    Evtl. liegts aber auch an meinem Code:

    void* wxComEventMonitorThread::Entry()
    {
        OVERLAPPED o;
        o.hEvent = CreateEvent (NULL,   // no security attributes
            FALSE,  // auto reset event
            FALSE,  // not signaled
            NULL);  // no name*/
        DWORD dwError,evtmask = cpem.Geteventmask();
        std::ofstream out("log.txt",std::ios::out);
        while (true) // solange weitermachen bis TRUE
      {
        if(!SetCommMask(cpem.GetHCom(),evtmask))
            out << GetLastError() << std::endl;
        BOOL result = WaitCommEvent (cpem.GetHCom(), &evtmask, &o);  // EventMask "scharf machen"
        if(!result)
        {
    
            out << "error";
            switch (dwError = GetLastError())
    			{
    			case ERROR_IO_PENDING:
    				{
    					out << "\n ERROR_IO_PENDING" << std::endl;
    					break;
    				}
    			case 87:
    				{out << "\n 87" << std::endl;
    					// Under Windows NT, this value is returned for some reason.
    					// I have not investigated why, but it is also a valid reply
    					// Also do nothing and continue.
    					break;
    				}
                default:
                out << dwError << std::endl;
    			}
    
        }
        if(dwError == ERROR_IO_PENDING)
        {
        // kommt der Event, ist auch die dwEvtMask geladen und es kann
        if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE))
        {
            LichtschrankenEvent e(EVT_LICHTSCHRANKE);
            sink->AddPendingEvent(e);
            //std::ofstream out("log.txt",std::ios::out|std::ios::app);
            out << "IO EVENT event" << std::endl;
        }//*/
        else{out << "no event" << std::endl;}
        }
        wxThread::Sleep(5);
        if(TestDestroy())
            break;
      }
        return 0;
    }
    

    Momentan ist es so, das WaitCommEvent einen Fehler zurückgibt: ERROR_IO_PENDING

    So jetzt funktionierts. Der code oben ist jetzt korrigiert.

    phlox


Anmelden zum Antworten