COM(X) öffnen klappt nur nach HyperTerminal



  • Hallo
    Also wenn ich den PC neu starte, kann ich zwar senden(WriteFile) aber ich empfange nichts (ReadFile dwRead==0).
    Wenn ich das HyperTerminal starte und den jeweileigen COM port öffne und wieder schliesse funkts .

    static	OVERLAPPED o;	
    static	COMMTIMEOUTS ctmo;
    static 	DWORD dwEvtMask=EV_ERR|EV_RXCHAR;
    static	DCB dcb;
    
    wsprintf(scPort,"\\\\.\\COM%s",cPort );
    
     	hCom = CreateFile (scPort, GENERIC_READ | GENERIC_WRITE, 0, 
                               NULL, OPEN_EXISTING,|0, NULL); 
    		rserror=GetLastError();
                     //...............
                    ZeroMemory(&dcb, sizeof(dcb)); 
    		dcb.DCBlength = sizeof(DCB);  
      		GetCommState (hCom, &dcb); 
    
    		dcb.wReserved  = 0; 
    		dcb.BaudRate  = CBR_19200;         
    		dcb.ByteSize  = 8;  
      		dcb.Parity    = NOPARITY;     
       		dcb.StopBits  = ONESTOPBIT;   
       		dcb.fBinary = TRUE;
    
    		if (!SetCommState(hCom, &dcb))
                    //.................Fehler->
                    //bei else gehts weiter
                    if (!SetCommMask (hCom, dwEvtMask))
                    //.................Fehler->
                    //bei else gehts weiter
    		memset (&o, 0, sizeof (OVERLAPPED));  
      		o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
    
    	GetCommTimeouts (hCom, &ctmo); 
      	ctmo.ReadIntervalTimeout         = 1000 / 19200 * (dcb.ByteSize +
     (dcb.Parity == NOPARITY ? 0 : 1) + (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2; 
      	ctmo.ReadTotalTimeoutMultiplier  = 1;  
      	ctmo.ReadTotalTimeoutConstant    = 10;  
      	ctmo.WriteTotalTimeoutMultiplier = 0; 
      	ctmo.WriteTotalTimeoutConstant   = 0; 
      	SetCommTimeouts (hCom, &ctmo); 
    
      SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);
                      //WriteFile(.......
    if (!WriteFile (hCom, &HEX_LOGIN, sizeof(HEX_LOGIN), &iBytesWritten, &o))
    		{
    
    			if (rserror!=ERROR_IO_PENDING)
    				{
    			rs232_error(rserror,"Fehler beim Einloggen");
    				}
    
    		}
    		else
    		{
    
        if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, 2000))   
        { 
          if (dwEvtMask & EV_RXCHAR)  
          { 
    
    		bRet=ReadFile (hCom, &wpString, sizeof(wpString), &dwRead, &o);
    

    bRet liefer TRUE aber dwRead = 0 !!?
    Vielleicht kann mir jemand helfen. Danke im voraus.
    Max



  • Nachdem du die Schnittstelle aufgemacht hast...:

    1. Lass das GetCommState weg und setze stattdessen alle Member der Struktur genau so wie du sie brauchst
    2. Dasselbe gilt für GetCommTimeouts
    3. rufe ClearCommBreak auf
    4. rufe ClearCommError auf

    3 und 4 sind möglicherweise nicht nötig, schaden aber auf keinen Fall.


Anmelden zum Antworten