(rs232|COM1) Initialisierung
-
Hallo Experten,
folgender Code zum Lesen von COM1: funktioniert, wenn ich vorher den HyperTerminal gestartet und wieder beendet habe, der Windows 2000 beiliegt:
void SomeClass::ReadRs232{ HANDLE m_hPort; m_hPort = CreateFile( "\\\\.\\COM1" , GENERIC_READ | GENERIC_WRITE , 0 // no sharing , NULL // no security , OPEN_EXISTING // , FILE_ATTRIBUTE_NORMAL/* | FILE_FLAG_OVERLAPPED*/, , 0 , NULL ); DCB dcb; memset( &dcb, 0, sizeof( dcb)); dcb.BaudRate= CBR_19200; dcb.Parity = NOPARITY; dcb.StopBits= ONESTOPBIT; dcb.ByteSize= 8; dcb.fBinary= true; if( !SetCommState( m_hPort, &dcb)){ return( -3); } COMMTIMEOUTS timeout; //TimeOut-Tabelle if (!GetCommTimeouts (m_hPort, &timeout)){ //TimeOut-Tabelle von Com holen return( -4); } timeout.ReadIntervalTimeout = MAXDWORD; //Timeout-Tabelle setzen timeout.ReadTotalTimeoutConstant = 0; timeout.ReadTotalTimeoutMultiplier = 0; if ( !SetCommTimeouts ( m_hPort, &timeout)){ //Timeout-Tabelle an Com schicken return( -5); } // Lies Daten char cPortBuf[255]; DWORD iBytesToRead= 255; // LPDWORD iBytesRead= 0; unsigned long iBytesRead= 0; ReadFile( m_hPort , cPortBuf , iBytesToRead // , iBytesRead , &iBytesRead , NULL ); }
Starte ich dieses Programm aber als erstes nach einem Bootvorgang, dann bleibt die Funktion ReadFile() hängen.
Welche Initialisierung habe ich vergessen, die aber HyperTerminal erledigt?Mit freundlichem Gruß,
luker
-
Welche Initialisierung habe ich vergessen, die aber HyperTerminal erledigt?
Ganz klar, Du hast nur einen kleinen Teil von dcb definiert. Z.B. die Groessen von Sende- und Empfangsbuffer
Ergo meine Empfehlung: Definiere ALLE Member von dcb.
Martin
-
hier mein Code:
so initialisiere ich den Port:
Aufruf zu beginn der main:port_initialisieren("COM1",38400,8,1); //***************************************************************** #include <windows.h> #define DTR 0 #define RTS 1 HANDLE hCom; static int dtr_last_state=1,rts_last_state=1; /************************************************************************************************/ void port_initialisieren(char port_name[],DWORD baudrate,BYTE byte_groesse,BYTE anz_stopbits) { DCB interface_parameter; COMMTIMEOUTS timeout_einstellungen; hCom=CreateFile( 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); EscapeCommFunction(hCom,CLRDTR); EscapeCommFunction(hCom,CLRRTS); }
was stimmt daran nicht oder fehlt??
Gruß Paddy
-
Benutze den selben Code wie Paddy0815. Muss erst irgendein Terminalprogramm ausgeführt haben, damits dann in meiner Anwendung das RX funktioniert. Woran kann's liegen.
Gruß Reschi
-
ich hab mal gelesen das man nicht GetCommState benutzen sollte, sondern die DCB Struktur komplett selbst ausfüllen soll.
-
Was mein Vorposter leser schrieb ist vollkommen richtig: Die DCB Struktur ist komplett selbst zu definieren!
In der MSDN ist die Struktur DCB sehr genau beschrieben: http://msdn2.microsoft.com/en-us/library/aa363214.aspx
Faustregel: Eine sauber geschriebene Software darf NIEMALS davon ausgehen, dass immer Standardwerte vorgefunden werden. (Es sei denn das ist in der MSDN auch so definiert).
Da ich in Urlaub bin (deshalb ist der "Urlauber"-Posting vorgestern auch von mir
), habe ich keinen Zugriff auf meine Sourcen. Ansonsten haette ich gerne ein Code-Schnipsel von mir hier reingestellt.
Sonnige Gruesse
Martin