WriteFile verstehen

Gast #2670976
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
(Firma: JDCC) #2671005
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
   );
#2671013
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
#2671016
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, ....
Persönliche Seite #2671036
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.

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