RS232 ansteuern - Fehler
-
Hallo ihr,
ich habe mich zwar mit der Suche bemüht, wurde jedoch leider nicht fündig.
Ich möchte via createFile ein Handle auf meine Com-Schnittstelle bekommen:
this->comhandle = CreateFile(name,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template
Wenn dies nun ausgeführt wird, bekomme ich immer ein INVALID_HANDLE_VALUE zurück.
Ich prüfe mit GetLastError ab, was für ein Fehler während des Aufrufs aufgetreten ist und bekomme folgende Meldung:
"Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist."Zur Info: Über ein externes Tool, kann ich auf die RS232-Schnittstelle zugreifen. Nach Benutzung des Programms beende ich die Verbindung.
Könnt ihr mir helfen?
Viele Grüße
EntonH
-
Benutze zu diesem Zweck besser einfertige Klasse. Da gibts z.B. was auf code-project. Nutze einfach mal die Forensuche, da wirst du schnell fündig. Und vielleicht hat sich dein Problem dann auch von selbst erledigt...
-
-
Was übergibst du als name? Und bist du sicher dass zu dem Zeitpunkt nicht schon irgendwer den COM-Port offen hat (evtl. auch dein eigenes Programm)?
Die Flags die du übergibst sind nämlich richtig.
-
Danke für eure Antworten

Als Port übergebe ich "\\\.\\COM3".
Das sollte doch eigentlich auch richtig sein, oder?Von meinem Programm kann der Port eigentlich nicht geöffnet sein, da dies die erste Stelle ist, an der auf den Comport zugegriffen werden soll.
Kann man irgendwie herausfinden, welche Programme den Comport benutzen oder bleibt mir nichts Anderes, als zu schauen und Programme ggf. abzuschießen?
-
Kann man irgendwie herausfinden, welche Programme den Comport benutzen
Ja, benutze den PortMon von Sysinternals.
http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx
Simon
-
Hi EntonH,
sowohl die Parameter der Funktion CreateFile() als auch der Name "\\\.\\COM3" sind in Ordnung.EntonH schrieb:
Ich prüfe mit GetLastError ab, was für ein Fehler während des Aufrufs aufgetreten ist und bekomme folgende Meldung:
"Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist."Kannst Du uns bitte verraten, welche Fehlernummer (der numerische Wert) das ist?
Eine mögliche Verwechslung von hexadezimal und dezimal ist ausgeschlossen?Wenn Du INVALID_HANDLE_VALUE zurückbekommst, dann bekommst Du per GetLastError() eigentlich nur die folgenden möglichen Werte (zumindestens nach meiner Praxiserfahrung):
- 5=ERROR_ACCESS_DENIED Port ist bereits belegt.
- 32=ERROR_SHARING_VIOLATION Port ist bereits belegt.
- 1119=ERROR_IRQ_BUSY Es konnte ein Gerät nicht geöffnet werden, das einen IRQ zusammen mit anderen Geräten verwendet. Mindestens ein weiteres Gerät, das diesen IRQ verwendet, war bereits geöffnet.
- 31=ERROR_GEN_FAILURE kommt bei einem deaktivierten IrDA-Port vor.
- 121=ERROR_SEM_TIMEOUT The semaphore timeout period has expired.
- 1118=ERROR_SERIAL_NO_DEVICE Es konnte kein serielles Gerät erfolgreich initialisiert werden.Martin
-
[Nachtrag:]
EntonH schrieb:
Zur Info: Über ein externes Tool, kann ich auf die RS232-Schnittstelle zugreifen. Nach Benutzung des Programms beende ich die Verbindung.
Erscheint Deine Fehlermeldung nur nach dem Start dieses externen Tools? Oder erscheint sie jedesmal?
Benutzt Du eine "handelsübliche" serielle Schnittstelle?
Oder evtl. einen USB- bzw. Ethernet-Konverter?Martin
-
Hallo!
Ich benutze einen USB-Konverter.
Und folgender Code liefert mir die in meinem 1. Posting geschilderte Meldung ("Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist." ):
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
-
Welchen USB-Konverter verwendest Du? Solchen mit dem IC von FTDIchip? Oder den mit dem IC von Prolific?
Hat Dein PC einen anderen COM-Port zum Testen? Wenn ja, funktioniert dort der Zugriff?
EntonH schrieb:
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);Offensichtlich handelt es sich um den Windows Fehlercode Nr. 183.
Zitat aus http://entwickler-forum.de/showthread.php?t=13477 :
Hallo,
ich hab das selbe Problem gehabt.
Bei mir lags daran, daß das ioresult
bei einer Vorgängeranweisung nicht
abgefragt wurde. Dadurch wurde der Fehler
('Verzeichnis bereits angelegt') an
die nächste Anweisung weitergeschleift.Gruß Michae
Trifft das vielleicht auch auf Deine Software zu? (egal ob Datei- oder Verzeichnis-Operationen, Abfrage auf Vorhandensein usw.)
Ich würde verbundenen Augen behaupten, Diese Vorgänger-Aktion ist die wahre Ursache und nicht die serielle Schnittstelle selbst.
Um diese Annahme zu bestätigen, rufe vor CreateFile() die Funktion auf:SetLastError( 0 );Bekommst Du da ein anderes Ergebnis?
Martin
P.S.: Benutze bitte die Code-Tags, das erhöht die Lesbarkeit.