Antwortlänge



  • Moin!!
    Habe folgendes Problem:
    mein prog zur Kommunikation mit dem Chipkartenleser hängt sich auf, wenn die Antwort vom Kartenleser kürzer ist als vorgesehen.

    ...
    char Antwort[46];
    ReadFile(hCom, Antwort, sizeof(Antwort), &length, NULL);
    for(i=0; i<sizeof(Antwort);i++)
    {
    m_sAntwort += Antwort[i];
    }
    UpdateData(FALSE);
    CloseHandle(hCom);
    

    d.h. wenn die Antwort kürzer ist als 46 passiert es. Im Ausgabefenster wird nichts angezeigt und das prog hängt. Ich kann verschiedene Kommandos senden, aber muss bis jetzt immer vorher die Antwortlänge im Quellcode eingeben. Das kann es nicht sein. Im Netz habe ich bisher nichts gefunden, wie man die Länge automatisch beim lesen setzten kann. 😞

    DANKE!



  • Servus,

    benutz doch einfach CString. Ich zeig dir das mal kurz wie man es machen könnte:

    COMSTAT stat;
    DWORD dwErrors;
    if (!ClearCommError(m_hComm, &dwErrors, &stat))
    {
       TRACE(_T("Zieh der Katze am Schwanz!! Son Mist!!!\n"));
       AfxThrowSerialException();
    }
    
    DWORD dwLength = 0;
    DWORD dwWaitingBytes = stat.cbInQue;
    
    CString strRead;
    strRead.GetBufferSetLength(dwWaitingBytes);
    ReadFile(m_hCom, strRead.GetBuffer(), dwWaitingBytes, &dwLength, NULL);
    trRead.ReleaseBufferSetLength(dwWaitingBytes);
    

    Das geht in die Hose, weil du versuchst 46 Byte zu lesen. Sind aber keine 46 Byte vorhanden schießt sich dein Programm ab.

    *winke*
    Hellsgore





  • Vielen Dank! 👍 Diese Lösung ist definitiv besser!
    Ich bekomme noch probleme mit "AfxThrowSerialException();" ->unbekannter Bezeichner??? Habs im moment auskomentiert.
    Bullach



  • Servus,

    @Stgt
    Ajo, kenn ich schon... 😃

    @Bullach
    Japp sorry, dass war mein Fehler. Ich habe hier ne eigene Exceptionklasse für Com Fehler. Wenn du dich wirklich intensiver damit beschäftigst dann rate ich dir eine vorgefertigte Klasse zu nehmen. Dann brauch man den ganzen Rotz mit ReadFile(blubbla), CommError(bla) etc. nicht. Ich verwende die CSerial Klasse von PJ Naughter (www.naughter.com), welche recht effizient und komfortabel ist. Einfaches Ansteuern, einfaches Auslesen, einfache Befehlsübergabe, einfach Konfiguration und eine schöne Exception klasse. Ich hatte mal rundgegoogelt und das war eigentlich für mich die komfortabelste. Kannst du ja mal testen....

    *winke*
    Hellsgore


Anmelden zum Antworten