Hallo! Ich habe ein kleines Problem. Ich will eine Serielle Schnittstelle unter Visual c++ 2005 ansprechen. Ich habe es bis jetzt nur mit dem kleinen Quellcode probiert: HANDLE hFile = ::CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); if (hFile == INVALID_HANDLE_ERROR); { printf(meldung[1]); std::cin.get(); } else printf(meldung[0]); Aber der Compiler macht es nicht. Ist dieser Befehl: HANDLE hFile = ::CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); falsch, oder ist es etwas anderes? Ich fände es echt gut, wenn irgentjemand mir helfen könnte. SAKI
Du solltest schon etwas genauer mitteilen, was dem Compiler nicht gefällt. Was gibt er denn von sich?
das ist es ja gerade das Program läuft, aber er macht nicht weiter... 0 Warnungen; 0 Fehler
Ich habe vor dem Code oben mir noch ein einfachen Satz ausgeben lassen mit printf. Mehr nicht
Dann hast du wohl was nicht ganz richtig verstanden. Der compiler erzeugt aus deinem Quelltext eine .exe - Datei. Die kannst du entweder außerhalb der IDE laufen lassen, oder im Debugger. Drück einfach mal F10 - dann macht das Programm üblicherweise unter Debuggerkontrolle einen Schritt und zeigt dir an, welcher Befehl als nächstes ausgeführt wird.
> serialmonitor.exe!00404b93()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder
fehlen, keine Symbole geladen für serialmonitor.exe]
KERNEL32.DLL!77e98989()
NTDLL.DLL!77885c09()
NTDLL.DLL!77885d6f()
NTDLL.DLL!77885d6f()
ist es das was du sehen wolltet? Mir sagt das nichts, da ich nebenbei
bemerkt ein Visual C++ NOOB bin.
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder
fehlen, keine Symbole geladen für serialmonitor.exe]
Was heißt das???
SAKI wrote: >> serialmonitor.exe!00404b93() > [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder > fehlen, keine Symbole geladen für serialmonitor.exe] > KERNEL32.DLL!77e98989() > NTDLL.DLL!77885c09() > NTDLL.DLL!77885d6f() > NTDLL.DLL!77885d6f() > > ist es das was du sehen wolltet? Mir sagt das nichts, da ich nebenbei > bemerkt ein Visual C++ NOOB bin. > > [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder > fehlen, keine Symbole geladen für serialmonitor.exe] > > Was heißt das??? Das ist ein Stack-Backtrace, wie es auf Englisch heißt. Hast du den aus WinDBG, oder wo stammt er her? Auf jeden Fall entnehme ich dem, daß dein Programm an der Adresse 0x0404b93 abgestürzt ist.
Das ist keine Fehlermeldung, sondern nur der Hinweis darauf, daß Du Dein Programm im "Release-Modus" übersetzt hast, und daher keine Debugsymbole enthalten sind. Was hieltest Du davon, mal Deinen Quellcode und nicht nur ein völlig nichtssagendes Fragment daraus hier zu posten?
Ja, sorry. #include <iostream> #include <windows.h> #include <stdio.h> #include <string.h> #include <serial.h> const char *meldung[] = { "Serielle Schnittstelle wurde gefunden!", //0 "Es wurde keine Schnittstelle gefunden!", //1 "Suche Serielle Schnittstelle bitte warten...", //2 } int main() { printf("Beginne Programm\n"); printf("-----------------\n\n"); printf(meldung[2]); printf("\n\n"); std::cin.get(); HANDLE hFile = ::CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); if (hFile == INVALID_HANDLE_ERROR); { printf(meldung[1]); std::cin.get(); } else printf(meldung[0]); } } So das ist mein ganzer Quellcode.
Sieh Dir mal folgende Zeile ganz genau an
1 | if (hFile == INVALID_HANDLE_ERROR); |
Dann übersetz es mal als Debug-Version und gehe dann in der IDE Schritt für Schritt mit F10 durch, bis es abschmiert. Dann kannst du dir ansehen, warum es schief ging. @ Rufus: Mit dem Typo hätte es aber garnicht erfolgreich compiliert werden dürfen - da stimmt was nicht... Zudem ist eine } zu viel vorhanden und bei der Definition des Stringarrays fehlt das ;
Was soll denn an der Zeile Falsch sein? (So jetzt ist es raus)
Geh das Programm im Einzelschritt im Debugger durch, dann wirst du es sehen...
He du Uhu, du bist ja ein ganz toller Hecht. Erst pseudointelligent von Debuggerausgaben schreiben, die du selbst nicht verstehst, und dich dann mit "...dann wirst du es sehen" aus der Diskussion stehlen. Leute wie du werden hier nicht gebraucht. Auch dann nicht, wenn du mindestens ein Posting pro Minute raushaust. Gerade dann nicht! Bei deinen Postings ist nämlich die Qualität proportional zur Quantität. Mit negativem Proportionalitätsfaktor.
hallo, das Semikolon muss weg if (hFile == INVALID_HANDLE_ERROR); -------------------------------------^
Wahrscheinlich hat ja irgendwann dein Programm soweit gestimmt, dass hinten ein EXE rausgekommen ist. Wenn Du aber hinterher noch was änderst und dann die Fehlermeldungen des Compilers ignorierst, so hast Du zwar immer noch ein EXE, aber halt das alte...
Danke, stimmt :-) Aber trotzdem war es das nicht. Ich finde es recht komisch, dass es bis zu der Zeile HANDLE hFile = ::CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); alles funktioniert. Also. Ist irgentetwas in der Zeile, was nicht dorthingehört?
Was hindert Dich daran, Dir die Bedeutung der Parameter der Funktion in der Dokumentation anzusehen?
wenn ich "serial.h" include, dann zeigt er mir die meldung an: fatal error C1083: Datei (Include) kann nicht geöffnet werden: "serial.h": No such file or directory Muss ich erst ein "file or directory" selber erstellen??? Vielleicht ist das ja auch DER Fehler.
Entweder ich bin zu blöd in der Hilfe nachzuschauen, aber ich, oder die Hilfe findet den Befehl CreateFile nicht. Und mit dem Ganzen Befehl erst recht nicht. (logisch) Bin ich jetzt zu blöd oder ist es etwas anderes?
> wenn ich "serial.h" include, Und warum tust Du das? Die darauffolgende Frage beantworte ich besser nicht, das könnte als unfreundlich empfunden werden. Klick mal auf den folgenden Link: http://msdn2.microsoft.com/en-us/library/Aa363858.aspx
Das heißt, dass diese Befehlszeileso ziemlich alles ist, was ich benötige? Kein include serial.h oder so? HANDLE WINAPI CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
So ziemlich alles???? Dann hast du lediglich ein Handle auf den COM-Port. Um zu lesen und zu schreiben (sinnvoll) brauchst du noch viel mehr. Eine Overlapped-Struktur und ein paar Readfile(...) WriteFile(...) sowie diesen ganzen DCB-Geraffel. Schau mal hier, wie das gemacht wird: http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483
Ja, schon klar, ich wollte fragen, ob der Befehl so ziemlich alles ist was ich zum ÖFFNEN des Ports brauche. Mein Fehler, habe mich nicht deutlich ausgedrückt. Sry
ähm... Danke. Noch etwas :-} Ich habe jetzt den fehler: error C2065: 'INVALID_HANDLE_ERROR': nichtdeklarierter Bezeichner Muss ich den Error selber "schreiben"? Ich dachte dass der schon vorprogammiert wäre.
Helft bitte mal einem C++ Laien: HANDLE hFile = ::CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); Wozu sind die :: gut ? Ich würde das (in ANSI C) so schreiben: HANDLE hFile = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0); --------------- SAKI: Zum wirklichen Öffnen braucht man sonst nichts. Aber: Zum erfolgreichen Öffnen ist auch erforderlich, dass der Port unter diesem Namen existiert, nicht bereits exklusiv von einem anderen Programm benutzt wird, Zugriffrechte vorhanden sind... Aber ich nehme an, das sind Binsenweisheiten, oder ?
Naja, erst einmal habe ich auch schon sehr lange nach der bedeutung der Zeichen :: recherchiert, aber nichts gefunden. Ich habe die einfach mal in meinen Quellcode eingefügt, um zu sehen was dann kommt. Aber ich sah eigentlich keinen Unterschied, was wohl daran lag, dass der Compiler nicht zu der Zeile gekommen war (glauber ich); Jedenfalls hat er bei mir keinen einzigen Fehler angezeigt. Ich würde auch gerne mal wissen, was die Zeichen zu bedeuten haben.
Ich bin einen Schritt weiter!!! Ich habe statt: INVALID_HANDLE_ERROR INVALID_HANDLE_VALUE geschrieben, jetzt geht es weiter, aber er findet keinen Port. HEUL
>So ziemlich alles???? Dann hast du lediglich ein Handle auf den >COM-Port. Um zu lesen und zu schreiben (sinnvoll) brauchst du noch viel >mehr. Eine Overlapped-Struktur und ein paar Readfile(...) WriteFile(...) >sowie diesen ganzen DCB-Geraffel. Was meinst du mit einer Overlapped-Strucktur? Ach ja, das mit dem sinnvollem Lesen und Schreiben, wollte ich auch noch machen. (Sinvoll oder?)
Schonmal probiert, den Port mit einem Terminalprogramm zu öffnen ?
Verzichte erst mal auf Overlapped-IO. Das ist nicht zwingend nötig.
> aber er findet keinen Port. *HEUL*
Heulen kannst Du woanders. "er findet keinen Port" ist keine
Fehlerbeschreibung. Wenn CreateFile den Rückgabewert
"INVALID_HANDLE_VALUE" liefert, dann kannst Du mit GetLastError Dir
einen Fehlercode zurückgeben lassen, und den solltest Du Dir mal
ansehen.
Ansonsten: In diesem Forum sind bereits mehrere funktionierende
Beispiele gepostet worden, wie man unter Windows mit der seriellen
Schnittstelle hantiert - was hältst Du davon, Dir mal eines davon
anzusehen?
Weiteres HEUL wird hier nur zunehmend unfreundlichere Reaktionen
hervorrufen.
ja t'schuldigung aber ich sitze jetzt schon lange an diesem Programm, auch wenn mein Quellcode nicht danach aussieht. Da ist doch ein Emotionaler Ausbruch doch mal wohl angebracht. Das war mein erster schon mal nachgeschaut? Ich habe es schon probiert mit einem Hyperterminal den Port zu öffnen, was geklappt hat. Ich habe aber auch keine Fehler und auch keine warnungen angezeigt bekommen, aber ich weiß auch nicht genau, wie ich jetzt den Befehl? GET_LAST_ERROR einfüge, damit er ihn mir auch anzeigt. HEUL t'schuldigung Rufus, das musste sein. Bis jetzt zeigt mir mein Programm, wenn ich es ausführe nur an: Suche einen Port... Keinen Port gefunden. mehr nicht. Außerdem hätte ich noch sehr gerne gewusst, ob ich den Befehl: std::cin.get(); irgentwie anders schreiben darf. Und noch mal: Was bedeuten die Zeichen :: ???
> aber ich weiß auch nicht genau, wie ich jetzt den Befehl? > GET_LAST_ERROR einfüge, damit er ihn mir auch anzeigt. Mein Gott. Lies doch einfach mal GENAU, was ich geschrieben habe: > Wenn CreateFile den Rückgabewert "INVALID_HANDLE_VALUE" liefert, > dann kannst Du mit GetLastError Dir einen Fehlercode zurückgeben > lassen, und den solltest Du Dir mal ansehen. Wo steht da was von GET_LAST_ERROR? GetLastError ist eine Betriebssystemfunktion. Die kann man aufrufen. Und deren Dokumentation kann man sich ansehen. Mach das. Sonst werde ich hier langsam emotional ...
DWORD Read(void* lpBuf, DWORD dwCount); BOOL Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped); void ReadEx(void* lpBuf, DWORD dwCount);<-----------------------------------| throw( CSerialException ); | | Diese befehlszeilen habe ich auf der Codeprojektseite gefunden, Stichwort | READ. | Jetzt hätte ich gerne gewusst, was mit dem DWORD gemeint ist. | | Ich glaube jetzt zu sehen, was du mit einer Overlapped-Structur meinst. Rein| zufällig die von den Zeilen oben?-------------------------------------------|
Ich klink mich da jetzt aus, da es offensichtlich keinen Sinn hat.
jaja, schon ok. Hast recht ich habe nicht richtig gelesen. GetLastError(); So hat es mir die "Dokumentation" ausgegeben. So habe ich ihn in mein Programm eingegeben, und er hat mir nichts angezeigt.
Au weia. Das ist eine Funktion. Die hat einen Rückgabewert. Den musst Du auswerten. Wie wäre es, wenn Du erst mal ein gaaaanz grundlegendes Buch über das Programmieren durcharbeitest?
SAKI wrote: > He du Uhu, du bist ja ein ganz toller Hecht. Erst pseudointelligent von > Debuggerausgaben schreiben, die du selbst nicht verstehst, und dich dann > mit "...dann wirst du es sehen" aus der Diskussion stehlen. Leute wie du > werden hier nicht gebraucht. Auch dann nicht, wenn du mindestens ein > Posting pro Minute raushaust. Gerade dann nicht! > > Bei deinen Postings ist nämlich die Qualität proportional zur Quantität. > Mit negativem Proportionalitätsfaktor. Gemessen an deinem Wissen über Windows-Programmierung nimmst du deinen Mund ganz schön voll. Ich geh mal zu deinen Gunsten davon aus, daß du die Qualität von Postings i.S. Programmierung genausowenig beurteilen kannst, wie deine eigenen Fähigkeiten auf diesem Sektor.
Wie Bitte? Ich hab das überhaupt nicht geschrieben. Schau doch erst einmal nach, dann schreib sowas dummes. Ich habe das wirklich nicht geschrieben! Auch wenn... Da ich als... Autor... Wer war das?
kann man den Autor manuell irgentwie verändern? Das hat doch gestern Rufus geschrieben!!!
FzK_SAKI wrote: > Wie Bitte? Ich hab das überhaupt nicht geschrieben. Schau doch erst > einmal nach, dann schreib sowas dummes. > > Ich habe das wirklich nicht geschrieben! Auch wenn... Da ich als... > Autor... > > Wer war das? Beitrag "Re: Serielle Schnittstelle ansprechen (schreiben/lesen)" Wenn du das wirklich nicht warst, dann hat sich irgend so ein Drecks-Troll unter deinem Nick hier eingemischt. Der soll sich meine Philipika hinter die Ohren schreiben... aber vermutlich steht da schon so viel, daß er nichts mehr lesen kann. Und dir kann ich nur raten, dich im Forum zu registrieren und nur noch eingeloggt hier was schreiben. Dann kann zumindest dir sowas nicht mehr passieren.
Ja, wenn ich hier noch etwas poste, dann mache ich das. Danke für den Tipp.
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.