Fehlermeldung unter Microsoft Visual Studio 2008 C++

Gast #1422279
Lesenswert?

Ich bin gerade dabei eine Klasse für die serielle Schnittstelle zu 
implementieren.

com.h
1
#ifndef __SERIALPORT_H__
2
#define __SERIALPORT_H__
3

4

5
class CSerialPort
6
{                             
7
public:
8
  // contruction and destruction
9
  CSerialPort();
10
  virtual  ~CSerialPort();
11

12
  // port initialisation                      
13
  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);
14

15

16
protected:
17
  
18
};
19

20

21
#endif __SERIALPORT_H__

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

Wenn ich den Code compiliere erhalte ich folgende Fehlermeldung:
... : error C2061: Syntaxfehler: Bezeichner 'CWnd'
Gast #1422281
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.
Gast #1422288
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.
Gast #1422296
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.
Gast #1422303
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.
Gast #1422306
Lesenswert?

Gibt es da überhaupt keine Möglichkeit.
Das müsste doch irgendwie funktionieren unter Visual C++ 2008.
1
// port initialisation                      
2
  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);
Gast #1422318
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?
Gast #1422328
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.
Gast #1423700
Lesenswert?

Wenn ich unter Microsoft Visual Studio C++ 2008 einen sogenannten HANDLE 
anlegen
1
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?
Gast #1423722
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.
1
CWnd* pPortOwner
2
CWinThread* m_Thread;
Gast #1424001
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.
Gast #1424044
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!
#1424070
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.
Gast #1424136
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.
#1424157
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

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