Auf COM-Port schreiben geht nicht (mehr)



  • Hi,

    Lustiger Effekt: Ich schreibe mittels

    char res=WriteFile(m_hCommPort,msg+slen,len-slen,&bytesWritten,NULL);
    {
       long l=GetLastError();
       l=0; // only for debugging purposes
    }
    

    auf einen zuvor korrekt und fehlerfrei geöffneten COM-Port, aber WriteFile will nix senden. "res" ist 1, der aufruf also nicht fehlgeschlagen, m_hCommPort ist gültig, msg+slen zeigt auf die korrekte Speicherstelle, len-slen hat auch die passende Größe aber bytesWritten liefert immer 0 zurück. Auch GetLastError() liefert keinen Fehler, es ist also alles OK, mal abgesehen davon, dass die Daten nicht rausgehen.

    Der COM-Port ist in einem Modus geöffnet, in dem ich asynchron Daten senden kann (also nicht darauf warten muss, dass diese vollstädnig rausgegangen sind).

    Hat jemand eine Idee, woran das liegen könnte?



  • Dieser Teil sieht richtig aus.
    Poste mal wie du den Com Port initialisierst!
    Sonst kann man dir ohne Glaskugel nicht helfen.



  • Der Teil ist aber wesentlich länger:

    COMMTIMEOUTS timeouts;
       DCB          ComSettings;
    
       memset(&ComSettings,0,sizeof(ComSettings));
       ComSettings.DCBlength=sizeof(DCB);
    
       m_hCommPort=CreateFile(config.port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
       if (!m_hCommPort)
       {
          m_hCommPort=NULL;
          return OAPC_ERROR_DEVICE;
       }
       if (!GetCommState(m_hCommPort,&ComSettings))
       {
          CloseHandle(m_hCommPort);
          m_hCommPort=NULL;
          return OAPC_ERROR_DEVICE;
       }
       ComSettings.BaudRate=9600;
       ComSettings.ByteSize=8;
       ComSettings.Parity=NOPARITY;
       ComSettings.fParity=0;
       ComSettings.StopBits=ONESTOPBIT;
       ComSettings.fOutX=FALSE;
       ComSettings.fInX=FALSE;
       ComSettings.fBinary=TRUE;
       ComSettings.fDtrControl=DTR_CONTROL_DISABLE;
       ComSettings.fRtsControl=RTS_CONTROL_DISABLE;
       ComSettings.fAbortOnError=FALSE;
    
       if (!SetCommState(m_hCommPort,&ComSettings))
       {
          CloseHandle(m_hCommPort);
          m_hCommPort=NULL;
          return OAPC_ERROR_DEVICE;
       }
    
       timeouts.ReadIntervalTimeout        =MAXDWORD;
       timeouts.ReadTotalTimeoutMultiplier =0;
       timeouts.ReadTotalTimeoutConstant   =0;
       timeouts.WriteTotalTimeoutMultiplier=0;
       timeouts.WriteTotalTimeoutConstant  =250;
    
       if (!SetCommTimeouts(m_hCommPort, &timeouts))
       {
          CloseHandle(m_hCommPort);
          m_hCommPort=NULL;
          return OAPC_ERROR_DEVICE;
       }
    

Anmelden zum Antworten