Forum: PC-Programmierung serielle Schnittstelle


von Anfänger (Gast)


Angehängte Dateien:

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?

von Anfänger (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Meldungen im Debug-Fenster sind vollkommen normal und in Ordnung.

Du musst keine weiteren Dateien einbinden.

In CSerial::Open könntest Du, wenn CreateFile fehlschlägt, ja mal mit 
GetLastError den Fehlercode bestimmen ...

von Anfänger (Gast)


Lesenswert?

>>DWORD error = GetLastError();

Bei GetLastError bekomme folgenden Hex Code zurück:

>>error = 0xcccccccc

von Anfänger (Gast)


Lesenswert?

Der obige Wert stimmt nicht ich erhalte nach der CreateFile Funktion 
wenn ich GetLastError aufrufe 0x00000000 zurück.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

0? Das bedeutet: - kein Fehler.

Dann steppe mal im Debugger die Open-Funktion durch und sieh Dir an, was 
geschieht.

von arc (Gast)


Lesenswert?

Zum zweiten
Beitrag "SetCommState"

> dcb.StopBits  = 1 ergibt nicht ein Stopbit sondern 1.5. Für ein Stopbit
> muss eine 0 im Feld stehen.

von Schorsch (Gast)


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.

von Karl H. (kbuchegg)


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?

von Schorsch (Gast)


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...

von Schorsch (Gast)


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 ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.