mikrocontroller.net

Forum: PC-Programmierung serielle Schnittstelle


Autor: Anfänger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
// COM.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include "Serial.h"


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

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

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

  return 0;
}


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?

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>DWORD error = GetLastError();

Bei GetLastError bekomme folgenden Hex Code zurück:

>>error = 0xcccccccc

Autor: Anfänger (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0? Das bedeutet: - kein Fehler.

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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.