Bytes senden via RS232



  • Hallo,

    ich programmiere gerade auf einem PDA mit MFC eine RS232 Kommunikation.
    Das empfangen der Daten klappt, jedoch kann ich nicht gleichzeitig Daten senden (nur ein Byte). Woran kann das liegen, sind Einstellungen an der Schnittstelle falsch, so das nicht gleichzeitig gesendet und empfangen werden kann?

    hier mal die wichtigsten Codesegmente:

    void mDaten::startSeq()
    {
    char sentchar[16];
    sprintf(sentchar,"%s","A");	
    fprintf(fileHandle,"Daten geschrieben: %i\n",comPort.SendData(sentchar,1));
    fprintf(fileHandle,"Datawaiting: %i\n",comPort.SendDataWaiting());
    	return;
    }
    
    int CSerial::SendData (const char *buffer, int iBytesToWrite)
    {
       if (INVALID_HANDLE_VALUE == hComm)
    	{
    		SetLastError(ERROR_INVALID_HANDLE);
          return (0);
    	}
    
       DWORD dwBytesWritten = 0;
       WriteFile(hComm, buffer, iBytesToWrite, &dwBytesWritten, NULL);
    
       return ((int) dwBytesWritten);
    }
    
    bool CSerial::Open (int nComPortNr, int nBaud, int nBits, int nParity, int nStopp)
    {
       if (INVALID_HANDLE_VALUE != hComm)
    	{
    		return (true);
    	}
    
       TCHAR szPort[16];
    
       wsprintf (szPort, TEXT("\\\\.\\COM%d"), nComPortNr);
    
       hComm = CreateFile (_T("COM1:"),
    						  GENERIC_READ | GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
    
       if (hComm == INVALID_HANDLE_VALUE)
       {
    	   return (false);
       }
    
       if (!GetCommTimeouts(hComm, &timeouts_alt))
       {
    		DWORD dwError = GetLastError();
    		Close ();
    		SetLastError(dwError);
    		printf("Fehler 3 %c",szPort);
          return (false);
       }
    
       COMMTIMEOUTS timeouts;
       timeouts.ReadIntervalTimeout = MAXDWORD ;
       timeouts.ReadTotalTimeoutMultiplier = MAXDWORD ;
       timeouts.ReadTotalTimeoutConstant = 3000; // Timeout ist 3000ms 
       timeouts.WriteTotalTimeoutMultiplier = 1000;
       timeouts.WriteTotalTimeoutConstant = 1000;
    
       if (!SetCommTimeouts(hComm, &timeouts))
       {
    		DWORD dwError = GetLastError();
    		Close ();
    		SetLastError(dwError);
          return (false);
       }
    
       DCB dcb;
       ZeroMemory (&dcb, sizeof(dcb));
    	dcb.DCBlength = sizeof(DCB);
    
       if (!GetCommState (hComm, &dcb))
       {
    		DWORD dwError = GetLastError();
    		Close ();
    		SetLastError(dwError);
          return (false);
       }
    
    	dcb_alt = dcb;
    	dcb.fBinary = TRUE; // muss immer "TRUE" sein!
    	dcb.fParity = TRUE;
    	dcb.fOutxCtsFlow = FALSE;
    	dcb.fOutxDsrFlow = FALSE;
    	dcb.fDtrControl = DTR_CONTROL_ENABLE;
    	dcb.fDsrSensitivity = FALSE;
    	dcb.fTXContinueOnXoff = TRUE;
    	dcb.fOutX = FALSE;
    	dcb.fInX = FALSE;
    	dcb.fErrorChar = FALSE;
    	dcb.fNull = FALSE;
    	dcb.fRtsControl = RTS_CONTROL_ENABLE;
    	dcb.fAbortOnError = FALSE;
    	dcb.wReserved = 0; // muss immer "0" sein!
    
    	dcb.BaudRate = nBaud;
    	dcb.ByteSize = (BYTE)nBits;
    	dcb.Parity   = (BYTE)nParity;
    	dcb.StopBits = (BYTE)nStopp;   
    
       dcb.fParity = (dcb.Parity != NOPARITY);
    
       if (!SetCommState(hComm, &dcb))
       {
    		DWORD dwError = GetLastError();
    		Close ();
    		SetLastError(dwError);
    		printf("Fehler 6 %c",szPort);
          return (false);
       }
    
       m_bOpened = true;
       return(true);
    }
    

    Danke
    TBone



  • Wie klappt es denn nicht?
    Und ... vielleicht wäre es hilfreich die Timeout-Werte explizit zu setzen wenn du schon mit Hardware Handshake arbeitest.



  • hustbaer schrieb:

    Wie klappt es denn nicht?
    Und ... vielleicht wäre es hilfreich die Timeout-Werte explizit zu setzen wenn du schon mit Hardware Handshake arbeitest.

    Hallo Hustbear,

    es klappt folgendes nicht! Der PDA bekommt nach dem Starten-Button die Daten von einem MSP, das lesen klappt! Vor dem Starten soll der PDA jedoch dem MSP noch ein Byte schicken, so dass der MSP weiß jetzt soll er die Daten schicken! Und genau dieses Senden des einen Bytes funktioniert nicht. Ich frag ich auch ab, ob eine Byte geschrieben hat und ob der Buffer leer ist, und darauf kommt die Antwort ein Byte geschrieben und Buffer leer, aber es kommt definitiv nichts am MSP an.

    void mDaten::startSeq()
    {
    char sentchar[16];
    sprintf(sentchar,"%s","A");   
    fprintf(fileHandle,"Daten geschrieben: %i\n",comPort.SendData(sentchar,1));
    fprintf(fileHandle,"Datawaiting: %i\n",comPort.SendDataWaiting());
        return;
    }
    

    Aber die Sache mit dem Hardwarehandshake klingt schonmal sehr gut, eigentlich könnte ich doch auch darauf verzichten, wie kann ich das ausschalten?

    Viele Grüße
    TBone



  • Hallo,

    ich habe jetzt DTR_CONTROL_DISABLE und RTS_CONTROL_DISABLE gesetz aber die Daten vom PDA kommen immer noch nirgens an, der PDA sendet nicht!

    Woran kann es noch liegen?

    Viele Grüße
    TBone



  • Könnte vielleicht XON/XOFF noch ein Problem sein?

    Gruss, Gio



  • Hallo,

    hab ich auch schon ausprobiert, ändertn leider nichts.

    Viele Grüße
    TBone



  • Naja, das habe ich wohl etwas falsch formuliert... wenn der PDA das unterstützt ist Hardware Handshake schon gut, bloss Timeouts gehören IMHO eingestellt.



  • Hallo,

    wie gesagt ich habe jetzt die Flusskontolle ausgeschalten und der PDA sendet immer noch nicht!
    Wenn ich im Programm abfrage ob Daten in den Ausgabebuffer geschrieben wurden, werden diese mit der korrekten Zahl bestätigt. Wenn ich dann abfrage ob noch Daten im Buffer stehen ist dieser leer.
    Wenn ich jetzt die Timeouts einstelle, kann es das Problem beim Senden beheben?

    Viele Grüße
    TBone



  • Hallo,

    kann es sein das so ein PDA gar keine Daten über die RS232 senden kann. Ich bin momentan am Verzweifeln und kurz davor alles als ein Elektronikproblem zu deklarieren.

    Viele Grüße
    TBone


Anmelden zum Antworten