mikrocontroller.net

Forum: PC-Programmierung Fehlermeldung unter Microsoft Visual Studio 2008 C++


Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin gerade dabei eine Klasse für die serielle Schnittstelle zu 
implementieren.

com.h
#ifndef __SERIALPORT_H__
#define __SERIALPORT_H__


class CSerialPort
{                             
public:
  // contruction and destruction
  CSerialPort();
  virtual  ~CSerialPort();

  // port initialisation                      
  bool InitPort(CWnd* pPortOwner, unsigned int portnr = 1, unsigned int baud = 19200, char parity = 'N', unsigned int databits = 8, unsigned int stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512);


protected:
  
};


#endif __SERIALPORT_H__

com.c
#include "stdafx.h"
#include "SerialPort.h"
#include <assert.h>

Wenn ich den Code compiliere erhalte ich folgende Fehlermeldung:
... : error C2061: Syntaxfehler: Bezeichner 'CWnd'

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Compiler kennt CWnd nicht. Ich glaube sie ist in der windows.h drin.

Warum nutzt du SerialPort.h (woher ist das überhaupt?) es gibt noch eine 
normale api für die serielle schnittstellt.

fileopen nimmt man zum öffnet der schnittstelle.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weisst du woher ich ein kleines Beispielprogramm herbekommen könnte?
Der Empfang soll nicht durch ein polling Verfahren realisiert werden.
Dazu möchte ich ein eigenen Thread benutzen. Ich weiss allerdings nicht 
wie man sowas realisiert.

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

Bewertung
0 lesenswert
nicht lesenswert
CWnd ist eine MFC-Klasse. Das ist C++, daher ist die Datei "com.c" 
falsch benannt. Benenne sie in com.cpp um.

Autor: real_skydiver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Ich glaube sie ist in der windows.h drin.
CWnd ist eine Wrapper-Class der MFC, also nicht in der windows.h 
definiert die ja nur die WIN32-Typen und -Definitionen. Um die 
MFC-Klasse CWnd zu verwenden musst Du beim Anlegen des Projektes achten, 
dass Du auch tatsächlich MFC ausgewählt hast. Ein Projekt hinterher 
dahingehend "umzustellen" ist zwar machbar - aber alles andere als 
trivial.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss nun nicht was ich jetzt tun sollte.
Das dies so kompliziert sein kann hätte ich jetzt so nicht gedacht.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Empfang soll nicht durch ein polling Verfahren realisiert werden.
> Dazu möchte ich ein eigenen Thread benutzen. Ich weiss allerdings nicht
> wie man sowas realisiert.
dafür braucht man doch ein Thread.

Wenn man ein normales Read macht, dann wartet er bis ein zeichen 
ankommt. Das ist aber kein polling. Wenn man nebenbei noch andere sachen 
machen gibt sachen wie WaitForMultibleObjects. Klar kann man soetwas 
über threads machen aber wenn du damit nie gearbeitest hast sollte man 
erstmal mit kleineren sachen anfangen.
Bei Threads must du dann auch wieder eine Synchronisation mit dem 
Mainthread machen.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es da überhaupt keine Möglichkeit.
Das müsste doch irgendwie funktionieren unter Visual C++ 2008.

// port initialisation                      
  bool InitPort(CWnd* pPortOwner, unsigned int portnr = 1, unsigned int baud = 19200, char parity = 'N', unsigned int databits = 8, unsigned int stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512);



Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht doch schon oben, lass das

> #include "SerialPort.h"
und
> InitPort

weg und verwende die alten Funktionen

CreateFile
ReadFile
WriteFile
CloseFile

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke Peter für den Rat. Diese werde ich auch benutzen.
Ich möchte dass das Programm bei ankommenden Daten reagieren soll und 
die Daten in einen Puffer ablegt. Dafür möchte ich einen Thread 
verwenden.
Weisst du wie sowas funktioniert?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Weisst du wie sowas funktioniert?
ja, aber das hilft dir jetzt nicht sonderlich weiter.


Fange erstmal ein Kommandozeilen programm an, was "Hallo World" ausgibt. 
Wenn du das hast, erweitere es um die serielle schnittstelle. Gib 
einfach alle Zeichen die du empfängst aus.

Autor: real_skydiver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde Dir raten tatsächlich erst etwas Erfahrung im Umgang mit VS 
(o.ä.) und der Sprache Deiner Wahl zu sammeln, bevor Du Dich an solch' 
ein Projekt wagst. Hier http://www.naughter.com/serialport.html gibt es 
übrigens eine super Klasse die Dir eigentlich alles an Arbeit abnimmt.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich unter Microsoft Visual Studio C++ 2008 einen sogenannten HANDLE 
anlegen
HANDLE m_hComm;
möchte dann erscheint ebenfalls eine Fehlermeldung:

error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: 
"default-int" wird von C++ nicht unterstützt.

Was müsste ich in Visual Studio einstellen damit dies funktioniert?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <windows.h>

damit müsste es gehen.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, leider funktioniert dies auch nicht. Die Fehlermeldung kommt 
trotzdem.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry es hat funktioniert. Hab mich vertan.
Wenn ich dies hier verwende, dann erscheinen auch Fehlermeldungen.

error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: 
"default-int" wird von C++ nicht unterstützt.
CWnd* pPortOwner
CWinThread* m_Thread;

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

Bewertung
0 lesenswert
nicht lesenswert
CWnd und CWinThread sind MFC-Klassen. Verwendest Du die MFC? Weißt Du, 
was Du da tust?

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich werde versuchen keine MFC-Klassen zu verwenden.

Rufus t. Firefly weisst du wie man einen Thread für die serielle 
Schnittstelle integrieren kann? Ich möchte dass beim Empfang ein Event 
ausgelöst wird. Das Polling Verfahren möchte ich nicht verwenden.

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

Bewertung
0 lesenswert
nicht lesenswert
Gut gemeinter Rat

Kauf dir ein C# Buch und wechsle die Sprache.
Dir fehlt zuviel Wissen über Windows-Programmierung. C# nimmt dir einen 
Grossteil davon ab.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weis schon wie man einen Thread in C++ aufsetzt. Das ist kein 
Problem.

Autor: TinoM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einem Buch finde ich nicht das was ich möchte. Ich möchte eigentlich 
nur einen Event auslösen wenn von der serielle Schnittstelle was ankommt 
bzw. wenn ich über die serielle Schnittstelle was senden möchte. Das ist 
alles!

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

Bewertung
0 lesenswert
nicht lesenswert
TinoM schrieb:
> In einem Buch finde ich nicht das was ich möchte. Ich möchte eigentlich
> nur einen Event auslösen wenn von der serielle Schnittstelle was ankommt
> bzw. wenn ich über die serielle Schnittstelle was senden möchte. Das ist
> alles!

Und genau das ist in C# alles schon erledigt.
Wenn ich mir ansehe, wie du mit der Windows-Programmierung mit den 
simplen Sachen schon kämpfst (und das fängt bereits damit an, welchen 
Header du inkludieren musst um ein HANDLE zu erhalten), dann möchte ich 
dich eigentlich nicht durch die Grundlagen der Windows-Progammierung 
direkt an der C-API durchsprechen. Und das ist viel, sehr viel. Charles 
Petzold hat ein ganzes Buch darüber geschrieben.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also ich weis schon wie man einen Thread in C++ aufsetzt. Das ist kein
> Problem.
ein thread der einfach nur sinnlos läuft ist ja auch kein problem.

Aber sobald er mit dem Rest der Anwendung kommuniziern muss wird es 
wesentlich schwerer.
Und was hast du immer mit dem Polling, kein mensch poll auf der 
seriellen schnittstelle rum. Man macht ein Read und bekommt etwas 
zurück. Man kann auch noch ein Timeout angeben.
Wenn du in dem Thread daten empfängst hilft dir ein event auch nicht 
weiter dann der Main-Thread warten gar nicht auf Events. Der MainThread 
warten in einer windowsanwendung auf Windows-Messages. Diese müsstest du 
dann erzeugen.

Schreibe doch erstmal etwas genauer was das Programm am ende machen 
soll.

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

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
>> Also ich weis schon wie man einen Thread in C++ aufsetzt. Das ist kein
>> Problem.
> ein thread der einfach nur sinnlos läuft ist ja auch kein problem.
>
> Aber sobald er mit dem Rest der Anwendung kommuniziern muss wird es
> wesentlich schwerer.
> Und was hast du immer mit dem Polling, kein mensch poll auf der
> seriellen schnittstelle rum. Man macht ein Read und bekommt etwas
> zurück. Man kann auch noch ein Timeout angeben.

Man könnte auch einen asynchronen read benutzen (in Windows Terminologie 
ist das ein overlapped IO). Das Stichwort dazu lautet: ReadFileEx
(Und das der TO diese Funktion noch nicht gesehen hat, sagt mir 
eigentlich, dass er sich noch nicht mal die Mühe gemacht hat nach 
ReadFile und den restlichen oben genannten Funktionen zu googeln und die 
Doku dazu in der MSDN zu lesen, denn da wird überall auf diese 
Möglichkeit hingewiesen. Und jemand der keine MSDN Doku liest, hat in 
der Windows Programmierung sehr sehr schlechte Karten)

Aber die Probleme mit der Thread Synchronisierung lösen sich deswegen ja 
auch nicht in Luft auf.

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.