serielle Schnittstelle

Gast #549574
Lesenswert?

Ich habe eine Klasse CSerial mit der möchte ich eine Kommunikation mit 
der seriellen Schnittstelle auffbauen. Als Compiler verwende ich 
Microsoft Visual C++ 6.0.
1
// COM.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
2
//
3

4
#include "stdafx.h"
5
#include "Serial.h"
6

7

8
int main(int argc, char* argv[])
9
{
10
  CSerial * pSerial = new CSerial;
11

12
  pSerial->Open(1,9600,8,1,1);
13

14
  printf("IsOpen: %d\n", pSerial->IsOpen());
15
  pSerial->Close();
16

17
  return 0;
18
}

Der Com Port kann bei mir nicht geöffnet werden. Habe kein weiteres 
Programm gerade am laufen, wo die Schnittstelle blockieren könnte.
Irgendwas mit dem HANDLE stimmt da nicht. Ich erhalte bei hComm immer 
0xFFFFF...
[c]
BOOL CSerial::IsOpen()
{
   if (INVALID_HANDLE_VALUE != hComm)
       return (TRUE);
   else
       return (FALSE);
}
[c]
Wo könnte da der Bug liegen?
Angehängte Dateien:
Gast #549576
Lesenswert?

Im Debug Fenster bekomme ich diese Meldungen:

"C:\temp\COM\Release\COM.exe" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
"ntdll.dll" wurde geladen. Es wurden keine entsprechenden 
Symbolinformationen gefunden.
"C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\user32.dll" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\gdi32.dll" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\AMInit.dll" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
Thread 0x660 wurde mit Code 0 (0x0) beendet.
Das Programm "C:\temp\COM\Release\COM.exe" wurde mit  Code 0 (0x0) 
beendet.

>>Muss ich bei mir noch Dateien zusätzlich einbinden?
Gast #824916
Lesenswert?

Ich hab ein ganz ähnliches Problem.
Mein Programm soll erstmal nur aus einer File Datenauslesen, und an eine 
Schnittstelle schicken. Das Gerät an diser Schnittstelle intzerpretiert 
die Daten, und schickt antworten zurück. Es gibt zwar keine Fehler, aber 
beim Debuggen passt was nicht, das macht er nicht gescheit.... Aber sehr 
selbst:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

HANDLE hComm;

int open_com1(void)
{
  int ret_val = 1;
  // open com1 port
  hComm = CreateFile( "COM1",
            GENERIC_READ | GENERIC_WRITE,
            0,
            0,
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            0);
  if (hComm == INVALID_HANDLE_VALUE) {
     // error opening port; abort
     printf("error in open_com1");
     ret_val = 0;
  }
  else {
    // configure com1 port

     DCB dcb;

     FillMemory(&dcb, sizeof(dcb), 0);
     if (!GetCommState(hComm, &dcb)) {    // get current DCB
      // Error in GetCommState
      ret_val = 0;
     }
     else {
      // Update DCB rate.
      dcb.BaudRate = CBR_57600 ;
       // Set new state.
      if (!SetCommState(hComm, &dcb)) {
        // Error in SetCommState. Possibly a problem with the 
communications
        // port handle or a problem with the DCB structure itself.
        ret_val = 0;
      }
     }
  }

  return ret_val;

}

int read_com1(char *p_buf, int number)
{
  int ret_val = 0;
  long number_bytes_written = 0;

  ReadFile (hComm,          // Port handle
        p_buf,          // Pointer to the data to read
        number,          // Number of bytes to read
        &number_bytes_written,  // Pointer to the number of bytes read
        NULL
       );
  return ret_val;
}

int write_com1(char *p_buf, int number)
{
  int ret_val = 0;
  long number_bytes_written = 0;

  WriteFile (hComm,                 // Port handle
               p_buf,                 // Pointer to the data to write
               number,                // Number of bytes to write
               &number_bytes_written, // Pointer to the number of bytes 
written
               NULL
        );
  return ret_val;
}

int close_com1()
{
  int ret_val = 0;
  CloseHandle(hComm);
  return ret_val;
}



int main()
{
  FILE *fp_input;
  int ret_val = 0;
  char input_buffer[30];
  char output_buffer[30];

  if(open_com1() == 1) {
    if((fp_input= fopen("text.txt", "r")) != NULL) {
      do {
        // send command to AVR32 application
        write_com1("send 25", 7);

        //  read data from input file
        fread(input_buffer, sizeof( char ), 25,fp_input);

        //  write data via COM1 to AVR32 application
        write_com1(input_buffer, 25);

        // send command to AVR32 application
        write_com1("buffer", 6);

        //  read data from COM1
        read_com1(output_buffer, 25);

      }while(!feof(fp_input));
    }

    fclose(fp_input);
    fp_input=NULL;  //Macht den Pointer ungültig
  }
  else {
    printf("\nCouldn't open COM1");
  }

  close_com1();
  return ret_val;
}




Die Fehlermeldung beim debuggen:

"ntdll.dll" wurde geladen. Es wurden keine entsprechenden 
Symbolinformationen gefunden.
"C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine 
entsprechenden Symbolinformationen gefunden.
Thread 0xD4 wurde mit Code 0 (0x0) beendet.
Das Programm "C:\Dokumente und Einstellungen\gefische\Eigene 
Dateien\Debug\Cpp1.exe" wurde mit  Code 0 (0x0) beendet.
#824944
Lesenswert?

Schorsch wrote:

> Die Fehlermeldung beim debuggen:
>
> "ntdll.dll" wurde geladen. Es wurden keine entsprechenden
> Symbolinformationen gefunden.
> "C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine
> entsprechenden Symbolinformationen gefunden.
> Thread 0xD4 wurde mit Code 0 (0x0) beendet.
> Das Programm "C:\Dokumente und Einstellungen\gefische\Eigene
> Dateien\Debug\Cpp1.exe" wurde mit  Code 0 (0x0) beendet.

Sieht für mich danach aus, als ob dein Programm ganz normal
durchgelaufen ist. Da ist nichts seltsames oder komisches
daran.

Wie hast du den Debugger gestartet?
Mit F5 (für Run) oder F10 (für Single Step)

Hast du mal Breakpoints gesetzt?
Gast #825520
Lesenswert?

Ja habe Breakpoints gesetzt, und sehe auch wo er aussteigt, jedoch, als 
ich es grade wieder versucht habe, kam direkt beim erstelln folgender 
kritischer Error (ohne etwas verändert zu haben !):

Kompilierung läuft...
hauruck.c
fatal error C1001: INTERNER COMPILER- FEHLER
  (Compiler-Datei 'E  Bitte klicken Sie im Menü '?' von Visual C++ auf 
'Software Service',
    oder öffnen Sie die Hilfedatei für den Software Service, um weitere 
Informationen zu erhalten.
Fehler beim Ausführen von cl.exe.


...
Es gibt im übrigen diesen 'Software Service' ncht...
Gast #825543
Lesenswert?

Hat sich erledigt...
Der Fehler ist nicht problematisch, und ich bin beim debuggen mit F11 
immer in die Funktionen rein (z.b. FOPEN), aber das ist ja in ner 
Bibliothek eingebunden, in Assambler, deshalb tut e sich schwer beim 
debuggen usw...

Er ließt zumindest brav die Datei aus, wenn ich mit F10 vorgeh.


Danke sowweit, ihr hört bald wieder von mir ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren