Forum: PC-Programmierung WriteFile verstehen


von Tester_X (Gast)


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:
1
.
2
.
3
.
4
  char szBuff[9] = {0};
5
  DWORD dwBytesWrite = 128;
6
  if(!WriteFile(hSerial, szBuff, n, &dwBytesWrite, NULL)){
7
      cout << "dwBytesWrite: error occurred\n"; 
8
  }
9
  else{
10
      cout << "Geschrieben:" << dwBytesWrite << "\n"; 
11
  }
12
.
13
.
14
.

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

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Was ist denn "n" ?

von Klaus W. (mfgkw)


Lesenswert?

Tester_X schrieb:
> Es ist jetzt so, dass ich "dwBytesWrite = 128" aussende

wo das denn?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Manual nicht gelesen ...

von Klaus W. (mfgkw)


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/desktop/aa365747%28v=vs.85%29.aspx

von Klaus W. (mfgkw)


Lesenswert?

Joachim Drechsel schrieb:
> Manual nicht gelesen ...

Vermutlich :-)

von Joachim D. (Firma: JDCC) (scheppertreiber)


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

von Klaus W. (mfgkw)


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.

von Vlad T. (vlad_tepesch)


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

von Udo S. (urschmitt)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Tester_X (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

hm, was ich von Writefile() kenne, habe ich von der MSDN-Seite... :-)

von Vlad T. (vlad_tepesch)


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

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.