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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.