Forum: PC-Programmierung Probleme mit virtuellem COM-Port


von Stefan (Gast)


Lesenswert?

Möchte eine Kommunikation zwischen PC und uC über virt.COMPort aufbauen, 
bekomme eine Fehlermeldung nach Start der Anwendung:
der Code:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(void)
{
   HANDLE Port;
   DCB dcb;
   char portname[]="COM5";
   char ReadChar;
   DWORD BytesRW;

   Port=CreateFile("COM5",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0 
,NULL);
   dcb.BaudRate=9600;
   dcb.ByteSize=8;
   dcb.Parity=NOPARITY;
   dcb.StopBits=ONESTOPBIT;

   SetCommState(Port,&dcb);
   ReadFile(Port,&ReadChar,1,&BytesRW,NULL);

   printf("%s\n",ReadChar);
   CloseHandle(Port);
   system("PAUSE");
   return 0;
}

benutze DevC++, MinGW

Die Fehlermeldung: "COM.exe has encountered a problem and needs to 
close"
Probiere so etwas zum ersten mal, deswegen find ich auch keine 
Lösungsansätze.

Stefan

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1/ Im einfachsten Fall geht CreateFile schief, d.h. Port erhält ein 
illegales HANDLE und die Funktionen, die mit dem illegalen Port 
arbeiten, feuern das Programm ins Nirvana bzw. sticheln den Aufpasser im 
Kernel. Fehlerhandling bei API Zugriffen ist essentiell.

2/ Desweiteren ist der Formatstring im printf("%s\n",ReadChar); falsch. 
Auf eine Charvariable sollte man nicht als Stringvariable zugreifen.

von Stefan (Gast)


Lesenswert?

1. also macht es keinen Unterschied ob es eun Virtueller oder 
"einfacher"  COM Port ist

2. dann char[7] ReadChar; ReadFile liest ja ein Byte

Stefan

von Stefan (Gast)


Lesenswert?

Ich weiß auch nicht so recht was mit der com.exe anzufangen, sie wird 
bei compilieren auf jeden fall schon mal gelinkt

Stefan

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 1.

Weiss ich nicht. Mich störte nur die schlampige Programmierung mit 
Vernachlässigung aller Fehlermöglichkeiten.

> 2.

Entweder
1
...
2
   char ReadChar;
3
...
4
   ReadFile(Port,&ReadChar,1,&BytesRW,NULL);
5
...
6
   printf("%c\n",ReadChar);
7
...

oder
1
...
2
   char ReadChar[7];
3
...
4
   ReadFile(Port,ReadChar,1,&BytesRW,NULL);
5
   ReadChar[1] = '\0';
6
...
7
   printf("%s\n",ReadChar);

Noch besser ist es den Rückgabewert von auszuwerten, ob fehlerfrei 
gelesen wurde und im Erfolgsfall BytesRW als Arrayindex zu benutzen, um 
die Daten in ReadChar mit dem Nullbyte abzuschliessen.

http://msdn2.microsoft.com/en-us/library/aa365467.aspx
http://www.codeproject.com/system/serial_com.asp

von Stefan (Gast)


Lesenswert?

@Stefan B.
dann hast du das auch verschoben!.. ich hatte mich schon gewundert,

kannst du es dann bitte wieder zurück zu "uC & Elektronik" schieben, da 
kann man mir vielleicht eher helfen!

Stefan

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nein ich kann sowas nicht. Ein Moderator oder der Chef selbst hat deine 
Nachricht verschoben und das Doppelposting von eben gelöscht. 
Moderatoren und den Chef himself erkennt man am fettgedruckten 
Benutzernamen. Und ja, es hat schon einen Sinn, dass er das gemacht hat, 
auch wenn du das heute noch nicht verstehst ;-)

von Wolfram (Gast)


Lesenswert?

>Port=CreateFile("COM5",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0,NULL);
>   dcb.BaudRate=9600;
>   dcb.ByteSize=8;
>   dcb.Parity=NOPARITY;
>   dcb.StopBits=ONESTOPBIT;

Die Zeilen haben schon genügend Potential dir eine Menge Ärger zu 
bereiten.
Mal abgesehen von der vergessenen Fehlerbehandlung.
Kopier nicht irgendwelche Beispiele aus dem Internet sondern lies dir 
das ganze in der MSDN durch, da gibt es extra einen Artikel.
Devicename "COMx" klappt nur von COM1 bis COM9. Da du auch mit 
virtuellen COMports arbeiten willst besteht eine Wahrscheinlichkeit für 
x>9.
Den DCB nur halb zu initialisieren dich abhängig von der vorherigen 
Initialisierung des COM Ports. Bsp. RTS/CTS etc.

von Stefan (Gast)


Lesenswert?

Womit such ich denn nach dem
>extra Artikel
?

Stefan

von Wolfram (Gast)


Lesenswert?

Ich nehme mal an, das war nicht ganz ernst gemeint?!

Serial Createfile dcb MSDN

die erten 3 Suchworte kann man auch einzeln in der MSDN verwenden.

von Stefan (Gast)


Lesenswert?

ich dachte du hast einen speziellen Artikel auf der MSDN Seite im Kopf, 
gefunden hab ich nur welche speziell für VB, aber das kann ja auch nicht 
schaden

Stefan

von Wolfram (Gast)


Lesenswert?

Vergiß die Suchfunktion der MSDN mit mehreren Stichworten, da findest du 
nichts oder nur Werbeschrott und seichte Artikel für Anfänger. Nimm 
google für den Einstieg in die MSDN, da werden die "technischen" 
(Einstiegs)seiten gefunden, wo brauchbare Informationen stehen.

von Christian R. (supachris)


Lesenswert?


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.