über die serielle schnittstelle asynchron Daten einlesen und senden



  • wie kann ich unter c oder c++ über die serielle Schnittstelle asynchron Daten einlesen und senden??



  • Am besten Du erfindest das Rad nicht neu, sondern verwendest eine fertige Klasse die das schon kann:
    http://www.codeproject.com/system/serial.asp



  • bei mir wartet WaitCommEvent und kommt nicht zurück!!

    do // in Endlos-Schleife auf Empfangssignale warten:
    {
    WaitCommEvent (hCom, &dwEvtMask, NULL); // Event mit Empfangssignalen verknüpfen

    if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
    {
    if ((dwEvtMask & EV_RXCHAR) || 1 )// Zeichen an RxD empfangen:
    {
    ...
    }
    }
    }
    woran liegt das bzw was muss ich ändern??



  • bei WaitCommEvent kein Zeiger auf ein OVERLAPPED Objekt übergeben.



  • do // in Endlos-Schleife auf Empfangssignale warten:
    {
    WaitCommEvent(hCom, &dwEvtMask, &o); // Event mit Empfangssignalen verknüpfen

    if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
    {
    if (dwEvtMask & EV_RXCHAR)// Zeichen an RxD empfangen:
    {
    }
    }
    }

    ok, das habee ich jetzt geändert! ich kann jetzt auch was empfangen, aber nun braucht die Funktion WaitCommEvent 9sek, nachdem ich das Byte an die com-Schnittstelle gesendet habe, bis sie zurückkehrt!!

    weißt du woran das liegen könnte??



  • und am ende braucht

    CloseHandle (hCom); // COM schließen

    20 sec, bis die funktion zurückkommt!!

    ich verstehe nur nicht wieso?



  • wieso braucht waitcommevent so lange??



  • jhck schrieb:

    und am ende braucht
    CloseHandle (hCom); // COM schließen
    20 sec, bis die funktion zurückkommt!!

    Das "CloseHandle" veranlasst den Treiber sicherzustellen, dass *ALLE* Daten auch über die serielle Schnittstelle geschrieben wurden.
    Wenn jetzt z.B. noch was im Puffer ist, dann wird es jetzt explizit geschrieben (davor gibt es keinen Mechanismus dies zu machen geschweige denn festzustellen, wann was geschrieben wurde).
    Wenn Du nun noch z.B. ein Handshake definiert hast, dann kann dies sehr lange dauern, da er ja jedesmal immer zuerst in den Timeout reinlaufen muss...
    Deshalb breche explizit alle Kommunikation ab und lösche alle Daten (PurgeComm) bevor Du CloseHandle aufrufst.



  • jetzt sieht es folgendermaßen aus:

    {
    ...
    PurgeComm(hCom, PURGE_RXABORT);
    CloseHandle (hCom); // COM schließen
    CloseHandle (o.hEvent); // Event-Handle zurückgeben
    }

    jetzt benötigt CloseHandle (hCom) "nur" noch 6 sek.

    aber WaitCommEvent baucht immernoch so 10sek!



  • Du solltest eher TX-Abort machen! oder steht bei mir irgendwas von Empfangen!?



  • WaitCommEvent(hCom, &dwEvtMask, &o); // Event mit Empfangssignalen verknüpfen
    GetLastError();
    if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, 500)) // warten bis Event oder 500ms
    {
    if (dwEvtMask & EV_RXCHAR)// Zeichen an RxD empfangen:
    {
    bRet = ReadFile (hCom, &InString, sizeof (InString), &dwRead, &o);
    if (!bRet)
    { // Fehlerausgabe:

    ...

    }
    }
    }
    ich habe es nochmal getestet, es liegt nicht an waitCommEvent, sondern an WaitForSingleObject !! der braucht so lange!!! momentan muss ich ihn mehrmal in der schleife durchlaufen bis er sie daten empfängt(je 500ms)...


Log in to reply