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


von SAKI (Gast)


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

von Uhu U. (uhu)


Lesenswert?

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

von SAKI (Gast)


Lesenswert?

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

von SAKI (Gast)


Lesenswert?

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

von SAKI (Gast)


Lesenswert?

den gibt er aus

von Uhu U. (uhu)


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.

von SAKI (Gast)


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???

von Uhu U. (uhu)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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?

von SAKI (Gast)


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.

von SAKI (Gast)


Lesenswert?

Nein, den habe ich aus der Aufrufliste

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal folgende Zeile ganz genau an
1
    if (hFile == INVALID_HANDLE_ERROR);

von Uhu U. (uhu)


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 ;

von SAKI (Gast)


Lesenswert?

Was soll denn an der Zeile Falsch sein?

(So jetzt ist es raus)

von Uhu U. (uhu)


Lesenswert?

Geh das Programm im Einzelschritt im Debugger durch, dann wirst du es 
sehen...

von SAKI (Gast)


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.

von EF (Gast)


Lesenswert?

hallo,
das Semikolon muss weg
    if (hFile == INVALID_HANDLE_ERROR);
 -------------------------------------^

von Bobby (Gast)


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...

von SAKI (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was hindert Dich daran, Dir die Bedeutung der Parameter der Funktion in 
der Dokumentation anzusehen?

von SAKI (Gast)


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.

von SAKI (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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

von SAKI (Gast)


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

von Christian R. (supachris)


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/serialcommunications/article.php/c2483

von SAKI (Gast)


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

von SAKI (Gast)


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.

von Bobby (Gast)


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 ?

von SAKI (Gast)


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.

von SAKI (Gast)


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

von SAKI (Gast)


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

von Bobby (Gast)


Lesenswert?

Schonmal probiert, den Port mit einem Terminalprogramm zu öffnen ?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von SAKI (Gast)


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 
:: ???

von Rufus Τ. F. (rufus) Benutzerseite


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 ...

von SAKI (Gast)


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?-------------------------------------------|

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich klink mich da jetzt aus, da es offensichtlich keinen Sinn hat.

von SAKI (Gast)


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.

von SAKI (Gast)


Lesenswert?

Ok. Tschüss Rufus. trotz allem, danke.

von Rufus Τ. F. (rufus) Benutzerseite


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?

von SAKI (Gast)


Lesenswert?

Ich bin schon dabei.

von Uhu U. (uhu)


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.

von FzK_SAKI (Gast)


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?

von FzK_SAKI (Gast)


Lesenswert?

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

von Uhu U. (uhu)


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.

von FzK_SAKI (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.