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?