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


von TinoM (Gast)


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'

von Peter (Gast)


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.

von TinoM (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von real_skydiver (Gast)


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.

von TinoM (Gast)


Lesenswert?

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

von Peter (Gast)


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.

von TinoM (Gast)


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

von Peter (Gast)


Lesenswert?

steht doch schon oben, lass das

> #include "SerialPort.h"
und
> InitPort

weg und verwende die alten Funktionen

CreateFile
ReadFile
WriteFile
CloseFile

von TinoM (Gast)


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?

von Peter (Gast)


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.

von real_skydiver (Gast)


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.

von TinoM (Gast)


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?

von Peter (Gast)


Lesenswert?

#include <windows.h>

damit müsste es gehen.

von TinoM (Gast)


Lesenswert?

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

von TinoM (Gast)


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;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von TinoM (Gast)


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.

von Karl H. (kbuchegg)


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.

von TinoM (Gast)


Lesenswert?

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

von TinoM (Gast)


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!

von Karl H. (kbuchegg)


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.

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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.

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.