Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
881
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    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
     

  2. #2
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    Noch ne kleine Zusatzinfo!!
    Der ErrorCode ist 6.
    Also Invalid Handle******
    Warum habe ich einen Invalid Handle ****
    Bitte um Hillfffffeeeeeeeee
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.

    Da ist ein Fehler in der Open Methode:

    Zitat Zitat von http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503
    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/netw...icle.php/c2503

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    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 :
    1
    
    serial.SendData(Sendstring, len);
    SendData :
    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 );
     
    }
    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
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Zitat Zitat von TheTank Beitrag anzeigen
    Stehe nun vor dem nächsten Problem!!
    Nun kann ich den COM Port öffnen jedoch hauts mich bei
    Code :
    1
    
    serial.SendData(Sendstring, len);
    Was heißt das? Was passiert denn?
    Zitat Zitat von TheTank Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    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
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Zitat Zitat von TheTank Beitrag anzeigen
    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().

    Zitat Zitat von TheTank Beitrag anzeigen
    Aja IDE VC++ 6.0
    Das hatte ich befürchtet. Kannst du denn nicht einen vernünftigen C++ Compiler verwenden?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    Nein kann ich leider nicht weil das eine Erweiterung auf ein bestehendes Programm ist
     

  9. #9
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    Ok GetLastError gibt mir 977 zurück******!
     

  10. #10
    TheTank TheTank ist offline Mitglied
    Registriert seit
    Jul 2010
    Beiträge
    17
    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.
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Zitat Zitat von TheTank Beitrag anzeigen
    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.
    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:

    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 );
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. RS232 Kommunikation mit Java
    Von nougs im Forum Java
    Antworten: 2
    Letzter Beitrag: 09.07.09, 14:50
  2. Kommunikation mit RS232 zu pc
    Von reto-meier im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 07.04.09, 12:59
  3. C# RS232 Kommunikation
    Von ibabak im Forum .NET Web und Kommunikation
    Antworten: 1
    Letzter Beitrag: 17.12.07, 15:23
  4. RS232 Kommunikation
    Von alma im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 03.09.04, 07:36
  5. RS232 Kommunikation unter c#
    Von RioT im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 30.03.04, 14:23