RS232 Kommunikation für Anfänger!!!



  • Hallo,

    könnte mir jemand helfen.
    Ich bin auf der Suche nach einer Dokumentation für
    die Kommunikation mit der RS232.
    Meiner Erfahrungen sind mit C++ sehr bescheiden.
    ( nur Standart-Sachen, Ein-Ausgabe, Bitoperationen, Filezugriffe,
    Funktionen,.. das wars dann aber auch schon. )
    Hab mal auf der Techniker-Schule ein bisschen C++ gehabt,
    das war aber naja.
    😕 😕 😕 😕 😕 😕 😕 😕 😕
    Zu meinem Problem.
    Ich möchte über die RS232 kommunizieren ( wie über HyperTerminal )
    nur, dass bei mir bestimmte Befehle in einer bestimmten Reihenfolge
    abgegeben werden, bzw gelesen werden muss.( Steuerung von einem TV )
    Über HyperTerminal funktioniert das wunderbar.
    Leider konnte ich keine Dokumentation finden, die die Sachen erklärt,
    die man da verwenden muss.
    Ich habe zwar ein paar Bsp-Programme gefunden. Diese aber verwenden
    ohne zu wissen was man tut, gefällt mir nicht.
    Hat jemand was, mit dem man eine Verbindung aufbauen kann.
    ( Schreiben, Lesen und ein paar Erklärungen dazu, dass
    es auch ich verstehe)

    Danke für Eure Hilfe.

    mfG patt



  • Erklärung: http://msdn.microsoft.com/en-us/library/ms810467.aspx
    Klasse die das Programmieren damit ein wenig vereinfacht: http://www.codeproject.com/KB/system/serial.aspx



  • In dem Beispiel wird ein Zeichen ('A') über COM1 ausgegeben und an COM2 gleich wieder empfangen. Wie das funktioniert, wirst du sicherlich mit Google herausfinden können.-Viel Spass!

    #include <windows.h>
    
    HANDLE hCom[2];
    
    /************************************************************************************************/
    
    void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits){
    	DCB interface_parameter;
    	COMMTIMEOUTS timeout_einstellungen;
    	static int cnt=0;
    
    	hCom[++cnt]=CreateFileA(
    		port_name,
    		GENERIC_READ|GENERIC_WRITE,
    		0,
    		NULL,
    		OPEN_EXISTING,
    		0,
    		NULL
    	);
    
    	GetCommState(hCom,&interface_parameter);
    	interface_parameter.DCBlength=sizeof(interface_parameter);
    	interface_parameter.BaudRate=baudrate;
    	interface_parameter.ByteSize=byte_groesse;
    	interface_parameter.StopBits=anz_stopbits;
    	interface_parameter.Parity=NOPARITY;
    	SetCommState(hCom,&interface_parameter);
    
    	timeout_einstellungen.ReadIntervalTimeout=100;
    	timeout_einstellungen.ReadTotalTimeoutMultiplier=100;
    	timeout_einstellungen.ReadTotalTimeoutConstant=100;
    	timeout_einstellungen.WriteTotalTimeoutMultiplier=100;
    	timeout_einstellungen.WriteTotalTimeoutConstant=100;
    	SetCommTimeouts(hCom,&timeout_einstellungen);
    }
    
    /************************************************************************************************/
    
    void port_schliessen(int port){
    	CloseHandle(hCom[port]);
    }
    
    /************************************************************************************************/
    
    void zeichen_senden(int port,char zeichen){
    	DWORD i;
    
    	WriteFile(hCom[port],&zeichen,1,&i,NULL);
    }
    
    /************************************************************************************************/
    
    char zeichen_empfangen(int port){
    	char	zeichen;
    	DWORD	i;
    
    	ReadFile(hCom[port],&zeichen,1,&i,NULL);
    
    	return zeichen;
    }
    
    /************************************************************************************************/
    
    #define COM1 1
    #define COM2 2
    
    int main(void){
    	char gelesenes_zeichen[2];
    
    	port_initialisieren("COM1",9600,8,1);
    	port_initialisieren("COM2",9600,8,1);
    
    	zeichen_senden(COM1,'A');
    
    	gelesenes_zeichen[0]=zeichen_empfangen(COM2);
    	gelesenes_zeichen[1]='\0';
    
    	MessageBoxA(NULL,gelesenes_zeichen,"",MB_OK);
    
    	port_schliessen(COM1);
    	port_schliessen(COM2);
    
    	return 0;
    }
    


  • Hier...

    void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits){ 
        DCB interface_parameter; 
        COMMTIMEOUTS timeout_einstellungen; 
        static int cnt=0; 
    
        hCom[++cnt]=CreateFileA( 
            port_name,
    ...
    

    ...sollte das ++ nach dem cnt sein anstatt davor!
    Also so:

    void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits){ 
        DCB interface_parameter; 
        COMMTIMEOUTS timeout_einstellungen; 
        static int cnt=0; 
    
        hCom[cnt++]=CreateFileA( 
            port_name,
    ...
    

    Sorry!



  • Ähh... wir sind hier bei C++/CLI und da nimmt man einfach die System::IO::Ports::SerialPort Klasse... dann ist es ganz einfach...

    http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx



  • Hi,

    Danke für die Hilfe!!!

    Werde aber bestimmt noch ein,... Fragen haben zu dem ein
    oder anderen Befehl.
    Eine paar Befehle habe ich noch nie gesehen bzw verwendet 😞
    Leider kann ich mich um C++ nur in der Freizeit kümmern ( lernen )
    Die liebe Arbeit.

    DANKE!!!

    mfG patt 😃 😃 😃



  • Ist zwar nun schon ewigkeiten her, jedoch in Zukunft für alle weitern Leser dieses Beitrags:

    #define COM1 1
    #define COM2 2
    

    das ist falsch!
    muss

    #define COM1 0
    #define COM2 1
    

    lauten, denn das array hat die länge 2, c++ beginnt bei 0 zu zählen also nur die indexe 0 und 1!

    Bei mir funktioniert der Code zwar, jedoch bekomme ich einen
    ERROR_INVALID_HANDLE
    6 (0x6)
    The handle is invalid.

    weiß jemand woran das liegen kann oder wie man das fixen könnte, oder ist es egal?


Anmelden zum Antworten