serial communication RS 232



  • Ich benutzt den Serial Source Code von Shibu http://www.codeguru.com/network/CSerialPort.html
    Mit dem Port oeffnen und Daten senden habe ich keine Probleme.
    An meinen Com Port ist ein DSP ueber RS232 angeschlossen. Der DSP sollte auf Commandos vom PC reagieren und dann Daten senden.
    Im Moment lese ich noch manuell ueber einen Button ein:

    void CTestSerialDlg::OnReadByte() 
    {
       // TODO: Add your control notification handler code here
       bool linefeed = false;
       bool carrigereturn = false;
       char unsigned chu[13];
       for(int ii=0;ii<sizeof(chu);ii++)
       chu[ii]=0;
    
       for(int i=0;i<13;i++ )
       {
       Port.ReadByte (chu[i]);
       if (chu[i]==10)
        linefeed = true;
       if (chu[i]==13)
        carrigereturn = true;
       if((linefeed) &&(carrigereturn))
          i=13;
       }
       for (int iii=0;iii<13;iii++)
       {   if (chu[iii]<32)
          chu[iii]=0;
       }
          m_byteread=CString(chu);
          UpdateData(false);
      }
    

    Das Problem ist, wenn im Puffer keine Daten sind, dann bleibt das Programm haengen. Wie kann man das besser loesen?
    Leider sind meine Kenntnisse nicht sehr gut, deshalb bitte wenn moeglich ausfuehrliche Antworten.
    Danke

    [ Dieser Beitrag wurde am 24.09.2002 um 12:49 Uhr von bandy2000 editiert. ]

    [ Dieser Beitrag wurde am 24.09.2002 um 12:50 Uhr von bandy2000 editiert. ]

    [ Dieser Beitrag wurde am 24.09.2002 um 13:05 Uhr von bandy2000 editiert. ]





  • hi...

    vielleicht hilft dir das...
    ich habe es mit einem Thread geloest....
    Funzt bei mir super

    //  das ist der aufruf
    AfxBeginThread(DERTHREAD, NULL,THREAD_PRIORITY_NORMAL); 
    
    // das ist mein Thread
    
    UINT DERTHREAD(LPVOID pWnd)
    {
    
        HANDLE hCom;
    
        hCom =  CreateFile ("COM1",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
    
        DCB dcbCommPort;
    
            dcbCommPort.DCBlength = sizeof(DCB);
            GetCommState(hCom, &dcbCommPort);
            BuildCommDCB("9600,N,8,1", &dcbCommPort);
            SetCommState(hCom, &dcbCommPort);
    
        DWORD len = 50; 
    
        ReadFile(hCom, lpByte, len, &dwBytesRecive, NULL);
    
        CloseHandle (hCom);
    
        return TRUE;
    }
    

    mfg uwe



  • HI Uwe!
    wie ich shcon geschrieben habe bin ich blutiger Anfaenger!
    Koenntest du daher die Sache mit dem Thread ein bisschen naeher erklaern, wo ich was wie in VC++ einfuegen muss und wie ich dann die Daten auch zu gesicht bekomme!
    Merci
    ANDY



  • Schau Dir meine Klasse an da wird die serielle Schnittstelle so konfiguriert das keine Wartezeiten mehr auftreten.
    Oder nimm gleich die Klasse ;-).



  • Oder bleib bei der Klasse die hat doch alles mitgeliefert !!!

    BOOL CSerialPort::SetCommunicationTimeouts
                     (DWORD ReadIntervalTimeout,
                      DWORD ReadTotalTimeoutMultiplier,
                      DWORD ReadTotalTimeoutConstant,
                      DWORD WriteTotalTimeoutMultiplier,
                      DWORD WriteTotalTimeoutConstant)
    

    Stell die Zeiten vernünftig ein und Du brauchst kein Thread ;-).



  • Danke toosten
    werds mal ausprobieren. Hab noch nicht viel mit diesen Zeiten rumgespielt!
    Cheers
    ANDY



  • Cool!
    jetzt siehts besser aus!
    Kann man diese Timeouts auch als bedingung fuer eine Schleife verwenden?
    Im moment laeuft die Schleife immer mit maximaler Wiederholung. Kann man irgendwie abbrechen wenn man den ersten Timeout bekommen hat?
    Auf alle faelle schon mal Danke soweit->toosten, uwe
    ANDY



  • Ich kenne die Lib/Dll, die Du nutzt nicht, aber die Lesebefehle "Port.ReadByte" geben doch i.A. eine definierten wert zurück, wenn die Queue des port leer war, z.B. <0. der müsste sich doch auswerten lassen?

    Gruss
    ehrig


Log in to reply