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
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?
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 ;
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.
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?
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?)
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?-------------------------------------------|
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?
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.