RS232: Geschwindigkeit während der übertragung umschalten?



  • Hi

    ich hab folgendes Problem: Das Protokoll das ich implementieren soll für die serielle Schniststelle sieht vor das die übertragugsgeschwindigkeit von Client und Server selbständig ausgehandelt wird. Angefangen wird mit 9600 Baud. Der Client frägt im ersten Schrit den Server welche Baudraten er unterstützt (Kannst du 115200Baud). Der Server antwortet dann mit einer Fehlermeldung oder mit einer Bestätigung. Im 2. Schritt initiert der Client dann die Geschwindigkeits umschaltung. Dann schalten beide auf die neue Baudrate um. Und genau hier trit mein Problem auf.

    Wie kann ich festellen, das die ComandoSequenz über die schnitstelle verschickt wurde um selbst in die neue Baudrate umschalten zu können?

    Momentan versuch ich mit WaitCommEvent( ... EV_TXENPTY ) ; festzustellen wann die Sequenz verschickt wurde. Das funktioniert leider nicht WaitCommEvent kehrt sofort zurück und ich schalte bereits zu früh in die neue geschwindigkeit um.

    OS: XP

    nachfolgend ein paar code schnipsel die vileicht interresant sein könnten.

    // Port initallisierung
    CreateFile (lpszPortName, // Pointer to the name of the port
                GENERIC_READ | GENERIC_WRITE,
                             // Access (read/write) mode
               0,            // Share mode
               NULL,         // Pointer to the security attribute
               OPEN_EXISTING ,// How to open the serial port
               0,            // Port attributes
               NULL);        // Handle to port with attribute
                             // to copy
    
    ...
    
    // Teil 2 der umschaltung verschicken
    
    /* set commMask for detecting transmit empty buffer */
    SetCommMask (LOWL_astThreadData[bPortIdentifier].hInterface, EV_TXEMPTY );
    
    /* transmit the data block */
    if (!WriteFile (hInterface,                          // Port handle
                  pabTransmitData,                       // Pointer to the data to write 
                  (DWORD)wTransmitData_len,              // Number of bytes to write
                  &dwNumBytesWritten,                    // Pointer to the number of bytes 
                                                         // written
                  NULL))                                 // Must be NULL for Windows CE
    {
        // WriteFile failed. Report error.
        ...
    }
    
    /* Wait for last charecter send */
    DWORD events = EV_TXEMPTY ;
    BOOL b = WaitCommEvent(hInterface,&events,NULL);
    
    // initieren der umschaltung
    

    Gruss Termite


Anmelden zum Antworten