ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
881
881
EMPFEHLEN
-
Hallo!!
Ich versuche über die COM Schnittstelle Daten auszulesen bzw. einzulesen.
Code :1 2 3 4 5 6
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 :1
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
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
-
02.09.10 13:02 #3
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Da ist ein Fehler in der Open Methode:
\edit: Da scheinen noch mehr Fehler drin zu sein, siehe die Kommentare hier: http://www.codeguru.com/cpp/i-n/netw...icle.php/c2503
Zitat von http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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
SendData :Code :1
serial.SendData(Sendstring, len);
das Problem ist, dass mir der Debugger beim Debuggen meldet :Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
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 ); }
WriteFile CXX0017: Fehler: Symbol "WriteFile" nicht gefunden
Das passiert auch bei ReadFile und anderen Funktionen!!
Kann mir da vielleicht jemand weiterhelfen ****
Bitte
-
02.09.10 15:30 #5
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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
-
02.09.10 15:57 #7
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Nein kann ich leider nicht weil das eine Erweiterung auf ein bestehendes Programm ist
-
Ok GetLastError gibt mir 977 zurück******!
-
Das habe ich zu Error Code 997 gefunden aber was bedeutet das und wie kann ich das Lösen****
Code :1
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.
-
03.09.10 08:34 #11
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Der ERROR_IO_PENDING ist schon OK, der wird ja auch behandelt.
Wenn ich mir den Code so anschaue, dann wird der Rückgabewert von WriteCommByte ja überhaupt nicht in der Schleife in CSerial::SendData() geprüft. Abgesehen davon gibt CSerial::SendData() immer TRUE zurück, was auch schon wieder Unsinn ist.
D.h. die Schleife läuft auf jeden Fall von 0 bis (size - 1) und die Methode gibt nur 0 zurück wenn du als size auch 0 übergeben hast.
Hast du denn wirklich alle Fehler in der CSerial Klasse beseitigt die hier (http://www.codeguru.com/cpp/i-n/netw...icle.php/c2503) gefunden wurden? Oder nimm evtl. stattdessen die CSerialPort Klasse - vielleicht ist die besser.
\edit: aus den Kommentaren von http://www.codeguru.com/cpp/i-n/netw...icle.php/c2503:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int CSerial::SendData( const char *buffer, int size ) { if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); BOOL bWriteStat; DWORD dwBytesWritten; bWriteStat = WriteFile( m_hIDComDev, buffer, size, &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( dwBytesWritten ); }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
RS232 Kommunikation mit Java
Von nougs im Forum JavaAntworten: 2Letzter Beitrag: 09.07.09, 14:50 -
Kommunikation mit RS232 zu pc
Von reto-meier im Forum C/C++Antworten: 0Letzter Beitrag: 07.04.09, 12:59 -
C# RS232 Kommunikation
Von ibabak im Forum .NET Web und KommunikationAntworten: 1Letzter Beitrag: 17.12.07, 15:23 -
RS232 Kommunikation
Von alma im Forum .NET ArchivAntworten: 2Letzter Beitrag: 03.09.04, 07:36 -
RS232 Kommunikation unter c#
Von RioT im Forum .NET ArchivAntworten: 1Letzter Beitrag: 30.03.04, 14:23





Zitieren

Login





