www.mikrocontroller.net

Forum: PC-Programmierung Probleme mit virtuellem COM-Port


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

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

Stefan

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1.

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

> 2.

Entweder
...
   char ReadChar;
...
   ReadFile(Port,&ReadChar,1,&BytesRW,NULL);
...
   printf("%c\n",ReadChar);
...

oder
...
   char ReadChar[7];
...
   ReadFile(Port,ReadChar,1,&BytesRW,NULL);
   ReadChar[1] = '\0';
...
   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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Womit such ich denn nach dem
>extra Artikel
?

Stefan

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch mal hier, erprobter Code: 
http://www.codeguru.com/Cpp/I-N/network/serialcomm...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.