www.mikrocontroller.net

Forum: PC-Programmierung WriteFile verstehen


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Tester_X (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi Leute,
ich bräuchte mal eure Hile bei folgendem C++ Code. Ich programmiere 
gerade meinen Comport. Soweit auch alles klar (erkenne, suchen, etc. der 
Ports klappt alles schonmal). Nur beim Senden und Empfangen von bits bin 
ich unsicher.

Hier der Code ausschnitt:
.
.
.
  char szBuff[9] = {0};
  DWORD dwBytesWrite = 128;
  if(!WriteFile(hSerial, szBuff, n, &dwBytesWrite, NULL)){
      cout << "dwBytesWrite: error occurred\n"; 
  }
  else{
      cout << "Geschrieben:" << dwBytesWrite << "\n"; 
  }
.
.
.

Ich bekomme immer die Ausgabe "Geschrieben: 8".
Es ist jetzt so, dass ich "dwBytesWrite = 128" aussende (binär: 
10000000), darum auch die "8".

Oder stimmt etwas nicht und dwBytesWrite zeigt immer 8 an, egal was 
passiert?

Ziel ist es ja, später über den COMPORT verschiedene Bits zu schicken.
Besten Gruß und danke

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Was ist denn "n" ?

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Tester_X schrieb:
> Es ist jetzt so, dass ich "dwBytesWrite = 128" aussende

wo das denn?

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Manual nicht gelesen ...

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du sendest ab &szBuff[0] soviele Byte, wie in n steht (vermutlich 8).

Die Anzahl der gesendeten Byte steht danach in dwBytesWrite (egal, was 
du vorher drin stehen hattest).

Zum Verstehen:
http://msdn.microsoft.com/en-us/library/windows/de...

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Joachim Drechsel schrieb:
> Manual nicht gelesen ...

Vermutlich :-)

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich will mal nicht so sein:

BOOL WriteFile(

    HANDLE hFile,  // handle to file to write to
    LPCVOID lpBuffer,  // pointer to data to write to file
    DWORD nNumberOfBytesToWrite,  // number of bytes to write
    LPDWORD lpNumberOfBytesWritten,  // pointer to number of bytes 
written
    LPOVERLAPPED lpOverlapped   // pointer to structure needed for 
overlapped I/O
   );

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Tester_X schrieb:
> Nur beim Senden und Empfangen von bits bin
> ich unsicher.

Bits wirst du mit Writefile auch nicht einzeln senden können, nur ganze 
Bytes.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Tester_X schrieb:

> Hier der Code ausschnitt:
> .
> .
> .
>   char szBuff[9] = {0};
die zu sendenen Daten sind also \0-Character
>   DWORD dwBytesWrite = 128;
dwBytesWrite ist ein Rückgabewert, da ist egal, was vorher drinsteht
>   if(!WriteFile(hSerial, szBuff, n, &dwBytesWrite, NULL)){
was ist n? n gibt die Anzahl der Bytes an, die aus szBuff gelesen werden


> Ich bekomme immer die Ausgabe "Geschrieben: 8".
Dann war n wahrscheinlich 8

> Es ist jetzt so, dass ich "dwBytesWrite = 128" aussende (binär:
> 10000000), darum auch die "8".
>
> Oder stimmt etwas nicht und dwBytesWrite zeigt immer 8 an, egal was
> passiert?
Das ist totaler quatsch, bitte lies auch mal die Doku zu Funktionen, die 
du benutzt.

>
> Ziel ist es ja, später über den COMPORT verschiedene Bits zu schicken.
> Besten Gruß und danke
nö, über den COMPORT verschickst du Bytes entsprechend der Konfiguration 
des Ports


Ps: such mal in der Codesammlung nach Portable Serial Library, da ist 
auch eine Windows implementierung drin

Autor: Udo Schmitt (urschmitt)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Schau mal in der Doku was WriteFile mit der Variablen "dwBytesWrite" 
macht.

Wenn in der Variablen 'n' die Größe des Puffers steht, dann solltest du 
auch sicherstellen daß der tatsächliche Puffer n Bytes groß ist.

Zum Beispiel mit einer Kostante:

#define BUF_SIZE 9
char szBuff[BUF_SIZE] = {0};

  if(!WriteFile(hSerial, szBuff, BUF_SIZE, ....

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Der Wert, der vor dem Aufruf im ungeschickt benannten "dwBytesWrite" 
drinsteht, ist völlig irrelevant.

Das ist ein Ausgabeparameter, in dem die Funktion ein Ergebnis 
zurückgibt. Und die Benennung des Parameters in der Dokumentation der 
Funktion mit dwBytesWritten -- man beachte die Vergangenheitsform! -- 
sollte darauf hinweisen.


Entscheidend ist hier der Parameter n, der teilt der Funktion mit, 
wieviele Bytes sie schreiben soll.

Autor: Tester_X (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Okay,
also erstmal danke für die Hilfe. Jetzt habe ich es gerafft. Manchmal 
ist Erfahrung und einfaches erklären besser, als eine MSDN website!

Gruß und danke

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hm, was ich von Writefile() kenne, habe ich von der MSDN-Seite... :-)

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Also ich finde die Dokumentation der Winapi eigentlich super.
Das einzige, was ich bemängeln würde ist, dass es ein paar mehr 
Beispiele geben könnte

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net