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
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.
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
Ich weiß auch nicht so recht was mit der com.exe anzufangen, sie wird bei compilieren auf jeden fall schon mal gelinkt Stefan
> 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
@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
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 ;-)
>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.
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.
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
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.
Schau doch mal hier, erprobter Code: http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.