RS232 Kommunikation

TheTank

Grünschnabel
Hallo!!
Ich versuche über die COM Schnittstelle Daten auszulesen bzw. einzulesen.
Code:
if(serial.Open(m_nPort, 38400))
{
	serial.SendData(Sendstring, len);
	bytesRead = serial.ReadData(m_sBufRes, 96);
}
serial.Close();

Dazu verwende ich die Klasse CSerial

Code:
CSerial serial;

Das Problem ist, dass keine Verbindung zur COM herstellen kann. Ich bekomme von der Open Funktion immer 0 zurück. Bedeutet dass es nicht möglich war die COM zu öffnen!!

Hier noch der Code zu der Open Funktion:
Code:
BOOL CSerial::Open( int nPort, int nBaud )
{

	if( m_bOpened ) return( TRUE );

	char szPort[15];
	char szComParams[50];
	DCB dcb;

	wsprintf( szPort, "COM%d", nPort );
	m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
	if( m_hIDComDev == NULL ) return( FALSE );

	memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
 	memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

	COMMTIMEOUTS CommTimeOuts;
	CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
	CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
	CommTimeOuts.ReadTotalTimeoutConstant = 0;
	CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
	CommTimeOuts.WriteTotalTimeoutConstant = 5000;
	SetCommTimeouts( m_hIDComDev, &CommTimeOuts );

	wsprintf( szComParams, "COM%d:%d,n,8,1", nPort, nBaud );

	m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
	m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

	dcb.DCBlength = sizeof( DCB );
	GetCommState( m_hIDComDev, &dcb );
	dcb.BaudRate = nBaud;
	dcb.ByteSize = 8;
	unsigned char ucSet;
	ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
	ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
	ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
	if( !SetCommState( m_hIDComDev, &dcb ) ||
		!SetupComm( m_hIDComDev, 10000, 10000 ) ||
		m_OverlappedRead.hEvent == NULL ||
		m_OverlappedWrite.hEvent == NULL ){
		DWORD dwError = GetLastError();
		if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
		if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
		CloseHandle( m_hIDComDev );
		return( FALSE );
		}

	m_bOpened = TRUE;

	return( m_bOpened );

}

Kann mir bitte jemand helfen :(
 
Noch ne kleine Zusatzinfo!!
Der ErrorCode ist 6.
Also Invalid Handle******
Warum habe ich einen Invalid Handle ****
Bitte um Hillfffffeeeeeeeee
 
Hi.

Da ist ein Fehler in der Open Methode:

http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503 hat gesagt.:
CreatFile does not return NULL
Legacy CodeGuru | 09/21/1999 12:00am
open commentclose comment
Originally posted by: mark

in the CSerial::Open() fuction, the line of code that reads:

if( m_hIDComDev == NULL ) return( FALSE );

should be written:

if( m_hIDComDev == INVALID_HANDLE_VALUE ) return( FALSE );

as CreateFile() never returns NULL.
\edit: Da scheinen noch mehr Fehler drin zu sein, siehe die Kommentare hier: http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503

Gruß
 
Danke für den Post hat mir schon mal weitergeholfen ******!
Stehe nun vor dem nächsten Problem!! :(
Nun kann ich den COM Port öffnen jedoch hauts mich bei
Code:
serial.SendData(Sendstring, len);
SendData :
Code:
BOOL CSerial::WriteCommByte( unsigned char ucByte )
{
	BOOL bWriteStat;
	DWORD dwBytesWritten;

	bWriteStat = WriteFile(m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
	if( !bWriteStat && (GetLastError() == ERROR_IO_PENDING ) ){
		if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0;
		else{
			GetOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
			m_OverlappedWrite.Offset += dwBytesWritten;
			}
		}

	return( TRUE );

}

int CSerial::SendData( const char *buffer, int size )
{

	if( !m_bOpened || m_hIDComDev == INVALID_HANDLE_VALUE ) return( 0 );

	DWORD dwBytesWritten = 0;
	int i;
	for( i=0; i<size; i++ ){
		WriteCommByte( buffer[i] );
		dwBytesWritten++;
		}

	return( (int) dwBytesWritten );

}
das Problem ist, dass mir der Debugger beim Debuggen meldet :

WriteFile CXX0017: Fehler: Symbol "WriteFile" nicht gefunden

Das passiert auch bei ReadFile und anderen Funktionen!!
Kann mir da vielleicht jemand weiterhelfen ****

Bitte
 
Stehe nun vor dem nächsten Problem!! :(
Nun kann ich den COM Port öffnen jedoch hauts mich bei
Code:
serial.SendData(Sendstring, len);
Was heißt das? Was passiert denn?
das Problem ist, dass mir der Debugger beim Debuggen meldet :

WriteFile CXX0017: Fehler: Symbol "WriteFile" nicht gefunden

Das passiert auch bei ReadFile und anderen Funktionen!!
Naja, ein Problem mit dem Debugger. Unschön, aber nicht schlimm.

Welchen Compiler / IDE verwendest du denn?

Gruß
 
Naja es is nicht nur wegen dem Debugger!!

In Send Data wird Sendstring ein char* auf die COM geschriebn mit WriteFile.
Nur dass WriteFile nicht zu funktionieren scheint denn es ist nicht nur ein Problem mit dem Debugger sondern allgemein, da mir das Programm nichts auf die Serielle Schnittstelle schreibt. Hast du irgendeine Idee warum WriteFile nicht funktionieren könnte? Ich frage das Ergebnis ab. Wenn er geschriebn hätte würde 1 zurück kommen, bei mir aber immer 0. Das selbe bei anderen Funktionen der WINAPI wie ReadFile oder GetOverlappedResult. Kannst du mit dieser Beschreibung mehr anfangen ****
Aja IDE VC++ 6.0
 
In Send Data wird Sendstring ein char* auf die COM geschriebn mit WriteFile.
Nur dass WriteFile nicht zu funktionieren scheint denn es ist nicht nur ein Problem mit dem Debugger sondern allgemein, da mir das Programm nichts auf die Serielle Schnittstelle schreibt. Hast du irgendeine Idee warum WriteFile nicht funktionieren könnte? Ich frage das Ergebnis ab. Wenn er geschriebn hätte würde 1 zurück kommen, bei mir aber immer 0. Das selbe bei anderen Funktionen der WINAPI wie ReadFile oder GetOverlappedResult. Kannst du mit dieser Beschreibung mehr anfangen ****
Prüf mal GetLastError().

Das hatte ich befürchtet. Kannst du denn nicht einen vernünftigen C++ Compiler verwenden?

Gruß
 
Das habe ich zu Error Code 997 gefunden aber was bedeutet das und wie kann ich das Lösen****
Code:
System error code 997 means "Overlapped I/O operation is in progress." This error code may also display as "ERROR_IO_PENDING" or as the value 0x3E5.
 
Zurück