mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle ansprechen (schreiben/lesen)


Autor: SAKI (Gast)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest schon etwas genauer mitteilen, was dem Compiler nicht 
gefällt. Was gibt er denn von sich?

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist es ja gerade das Program läuft, aber er macht nicht weiter...
0 Warnungen; 0 Fehler

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vor dem Code oben mir noch ein einfachen Satz ausgeben lassen 
mit printf. Mehr nicht

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den gibt er aus

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, den habe ich aus der Aufrufliste

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir mal folgende Zeile ganz genau an
    if (hFile == INVALID_HANDLE_ERROR);

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn an der Zeile Falsch sein?

(So jetzt ist es raus)

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh das Programm im Einzelschritt im Debugger durch, dann wirst du es 
sehen...

Autor: SAKI (Gast)
Datum:

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

Autor: EF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
das Semikolon muss weg
    if (hFile == INVALID_HANDLE_ERROR);
 -------------------------------------^

Autor: Bobby (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hindert Dich daran, Dir die Bedeutung der Parameter der Funktion in 
der Dokumentation anzusehen?

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Bobby (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schonmal probiert, den Port mit einem Terminalprogramm zu öffnen ?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: SAKI (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich klink mich da jetzt aus, da es offensichtlich keinen Sinn hat.

Autor: SAKI (Gast)
Datum:

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

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Tschüss Rufus. trotz allem, danke.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin schon dabei.

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: FzK_SAKI (Gast)
Datum:

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

Autor: FzK_SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann man den Autor manuell irgentwie verändern? Das hat doch gestern 
Rufus geschrieben!!!

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: FzK_SAKI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wenn ich hier noch etwas poste, dann mache ich das. Danke für den 
Tipp.

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.