Probleme mit virtuellem COM-Port

Gast #673025
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
Persönliche Seite #673046
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.
Persönliche Seite #673068
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
Gast #673342
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
Gast #673484
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.
Gast #673651
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.

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