Serielle Schnittstelle ansprechen (schreiben/lesen)

Gast #630585
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
#630596
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.
Gast #630598
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???
#630600
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.
Gast #630605
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.
#630613
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 ;
Gast #630754
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.
Gast #630790
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...
Gast #631022
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?
Gast #631033
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.
Gast #631050
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?
Gast #631087
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
);
Gast #631151
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.
Gast #631152
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 ?
Gast #631160
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.
Gast #631184
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?)
Persönliche Seite #631204
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.
Gast #631228
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 
:: ???
Persönliche Seite #631240
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 ...
Gast #631244
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?-------------------------------------------|
Gast #631259
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.
#631278
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.
Gast #631281
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?
#631287
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren