Forum: PC-Programmierung C++: COM-Port öffnen


von hiwie (Gast)


Lesenswert?

Hi,

ich möchte mit C++ die serielle Schnittstelle ansprechen.
Hierzu habe ich mal eine Methode erstellt, inder ich einen Com-Port 
öffnen
kann. Nun ist es so das beim complieren folgende Fehlermeldung 
erscheint:

>>Fehler  4 error C2664: 'CreateFileW': Konvertierung des Parameters 1 >>von 'char 
*' in 'LPCWSTR' nicht möglich


C-Code:
1
bool CRS232Port::Open(char* pPort, int time)
2
{
3
ComHandle=CreateFile(pPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
4
5
if (ComHandle != INVALID_HANDLE_VALUE)
6
{
7
    fSuccess=TRUE;
8
 ....

Wie müsste ich den Zeiger pPort casten?

von hiwie (Gast)


Lesenswert?

Fehlermeldung (Visual Studio 2005 Prof.):
Fehler  4 error C2664: 'CreateFileW': Konvertierung des Parameters 1 von 
'char*' in 'LPCWSTR' nicht möglich

von hiwie (Gast)


Lesenswert?

Das Problem hab ich nun gelöst.
So funktioniert es:
1
bool CRS232Port::Open(char* pPort, int time)
2
{
3
ComHandle=CreateFile(pPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
4
5
if (ComHandle != INVALID_HANDLE_VALUE)
6
{
7
    fSuccess=TRUE;
8
 ....

Beim ausführen des Programmes erscheint nun eine weitere Fehlermeldung:
Unbehandelte Ausnahme bei 0x00411d7f in SerialTest.exe: 0xC0000005: 
Zugriffsverletzung beim Schreiben an Position 0x00177c50.
1
#include "stdafx.h"
2
#include "RS232Port.h"
3
4
CRS232Port *port1;
5
6
int _tmain(int argc, _TCHAR* argv[])
7
{
8
  port1->Open("COM1",1000,0);
9
  return 0;
10
}

Wenn ich in main den COM Port öffnen will, entsteht ein 
Zugriffsverletzung.
Warum eigentlich? Das verstehe ich nicht.

von Karl H. (kbuchegg)


Lesenswert?

hiwie schrieb:

> Wie müsste ich den Zeiger pPort casten?

Wahrscheinlich wird dir ein Cast da nicht weiter helfen.

Das W steht für Wide-String. Und den wirst du nicht haben, wenn du der 
Funktione einen char* übergibst.

Wenn du das ganze Unicode nicht brauchst, wäre es das einfachst Unicode 
einfach abzuschalten. Ansonsten könnte dir MultiByteToWideChar 
weiterhelfen (aber unbedingt die Doku und auch weiterführende Doku dazu 
lesen)

von Karl H. (kbuchegg)


Lesenswert?

hiwie schrieb:

> Wenn ich in main den COM Port öffnen will, entsteht ein
> Zugriffsverletzung.
> Warum eigentlich? Das verstehe ich nicht.

Was verstehst du daran nicht:

CRS232Port *port1;

port1 ist ein Zeiger. So ein Zeiger kann auf ein CRS232Port Objekt 
zeigen, muss er aber nicht. Im Moment jedenfalls tut er das ganz sicher 
nicht.

int _tmain(int argc, _TCHAR* argv[])
{
  port1->Open("COM1",1000,0);

Tja. Und jetzt benutzt du den Zeiger, als ob er schon auf ein Objekt 
zeigen würde. Was er aber nicht tut!

Warum überhaupt der Zeiger? Warum nicht einfach:
1
#include "stdafx.h"
2
#include "RS232Port.h"
3
4
CRS232Port port1;
5
6
int _tmain(int argc, _TCHAR* argv[])
7
{
8
  port1.Open("COM1",1000,0);
9
  return 0;
10
}

von Peter (Gast)


Lesenswert?

wie soll das denn gehen?

> port1->Open("COM1",1000,0);


Open hat doch bloss 2 Parameter

> CRS232Port::Open(char* pPort, int time)

von hiwie (Gast)


Lesenswert?

Problem hab ich gelöst.
Wenn ich eine Instanz mit "CRS232Port port1;" anlege dann funzt es.
Ich hab jetzt ein weitere Problem. wie kann ich nun auf die ankommenden 
Daten reagieren?

von hiwie (Gast)


Lesenswert?

Wie habt ihr den Empfang in C++ realisiert?
Startet ihr dazu einen eigen Thread?

von ax (Gast)


Lesenswert?


von hiwie (Gast)


Lesenswert?

Danke ax für den Link.
Leider bringt mir diese Seite nichts.

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.