Tipps für serielle Kommunikation



  • Hallo zusammen

    Ich versuche ein simples Kommunikations-Protokoll innerhalb des USB-Protokolls zu definieren. Die Daten werden über eine serielle Schnittstelle versendet und empfangen. ReadFile() und WriteFile() funktionieren problemlos. Ich möchte die gesamte Kommunikation nun jedoch etwas optimieren. In meinem Protokoll ist ein Start- und Stop-Byte definiert.

    Muss ich nun jedes einzelne am Port ankommende Byte mit ReadFile() einlesen und überprüfen ob es sich um das Stop-Byte handelt?

    Mit SetCommMask(), seinem Attribut EV_RXFLAG und WaitCommEvent() komme ich nicht weiter...

    Bin für jeden Hinweis dankbar.

    Grüsse, Ratio


  • Mod

    Verwende eine Klasse wie diw von PJ Naughter:
    http://www.naughter.com/serialport.html



  • Danke für den Link. Habe mir die Klasse angesehen. Natürlich möchte ich das Rad nicht neu erfinden doch versuche ich die Kommunikation über den COM-Port analog der gelinkten Klasse selbst zu erstellen.

    Ich habe jedoch noch einige Verständnis-Fragen:

    Die erste dreht sich um das Event-Byte. Ich habe ungefähr folgenden Code:

    //Aktueller Status des COM
    	GetCommState(hComFile, &dcb);
    	dcb.EvtChar = (char)0xE0;	//End-Byte
    
        //Neuer Status setzen
    	if(!SetCommState(hComFile, &dcb))
    		return;
    
    	//Event-Maske setzen
    	if(!SetCommMask(hComFile, EV_RXFLAG))
    		return;
    
        //Auf das definierte Event warten
    	if(WaitCommEvent(hComFile, &dwCommEvent, &r) == FALSE)
    	{
    		if(GetLastError() == ERROR_IO_PENDING)
    		{
    			switch(WaitForSingleObject(r.hEvent, 1000))
    			{
    				case WAIT_OBJECT_0:	
    					break;    //Der Event wurde signalisiert
    				case WAIT_TIMEOUT:
    					return;	//Time-Out-Intervall abgelaufen
    					break;
    				default:
    					return;
    					break;	//Wait_Abandonned
    			}
    		}
    	}
    

    Da ich mit einem Sniffer die Kommunikation analysieren kann bin ich mir sicher dass das definierte Event-Byte in weniger als 1/4-ms gesendet wird. Weshalb laufe ich im Debug-Mode dann stets auf den Time-Out-Return?

    Grüsse, Ratio



  • Serielle Kommunikation ist NICHT einfach.
    Auch solltest Du den *gesamten* DCB nach Deinen wünschen setzen und nicht davon ausgehen, dass darin schon irgendetwas stimmt...


Anmelden zum Antworten