0x00 und WriteFile

moin


Weil 0 nicht wirklich ein Textzeichen ist.
Gibst du einen String aus in dem solch eine 0 ist, wird die Ausgabe dort abgebrochen und der Rest nicht mehr ausgegeben.

Bei der Datenübermitttlung kannst du das umgehen indem du vorher festlegst, wieviele Zeichen übertragen werden sollen. Dann hättest du alle übertragenen Zeichen in einem String, auch die Null.


mfg
umbrasaxum
 
danke erstmal!
du meinst bei WriteFile(hComm, buffer, iBytesToWrite, &dwBytesWritten, NULL), soll iBytesToWrite die länge der string übernitteln;;
In meinem Programm ist nicht anders oder habe dich falsch verstanden!?
 
ja ich habe die selbe Routine in anderen Programme benutzt, und die läuft einwandfrei,dabei war keine 0x00 zu übertragen!
 
moin


Ähm, wenn du keine 0 überträgst kann doch auch keine ankommen!
Oder geht es um die abschliessende 0?


mfg
umbrasaxum
 
@umbrasaxum: Ich glaube er meint, daß die Routine funktioniert, wenn keine 0 übertragen wird.
@sahili: Kannst Du mal den Code posten? Im Allgemeinen kann man natürlich auch eine 0 über die serielle Schnittstelle übertragen werden. Wenn du die empfangenen Daten dann allerdings als string oder char[] mit den String-Funktionen weiterverarbeitest, dann gibt's Probleme. Wenn Du mal den Code zeigst, wo eingelesen wird, dann können wir Dir evtl. eher weiterhelfen.
 
char InitString[] = "\0";
char *buffer = "\0";

InitString[0] = 0x02;
InitString[1] = 0x00;
InitString[2] = 0x02;
InitString[3] = 0x70;
InitString[4] = 0x72;
InitString[5] = 0x03;

strcpy(buffer, InitString);

iBytesToWrite = strlen(buffer);



if (WriteFile(hComm, Feld, iBytesToWrite , &dwBytesWritten, NULL ))
{

MessageBox("Schreiben auf COM1 ist erfolgreich durchgeführt");

}

aber wenn ich die laenge in iBytesToWrite festlege,dann läuft's ohne Probleme!!


meine Zweite Frage, soll bei ReadFile() auch beachten, meine was an 0 binär angeht

if(!ReadFile(hComm, &chRead, 1, &dwRead, NULL))

MessageBox("Error by Reading");


TEMP[0] = chRead;


while (ReadFile(hComm, &chRead, 1, &dwRead, NULL)) // wurde ein Zeichen gelesen?
{
if (dwRead != 1) // ..wenn nicht, dann ist hier Schluß
break;

//i = 0;

TEMP[++i] = chRead;
//TEMP++;
//buffer[i++] = chRead; // wann ja, dann das Zeichen in den Buffer schreiben
}
 
moin


Also
Code:
char InitString[] = "\0";
char *buffer = "\0";
würde ich so nicht machen, lieber
Code:
char *InitString = new char[20];
char *buffer = new char[20];

aber wenn ich die laenge in iBytesToWrite festlege,dann läuft's ohne Probleme!!
Ja, genau!
Und das Problem ist:
Code:
strcpy(buffer, InitString);

iBytesToWrite = strlen(buffer);
Da in InitString[1] eine 0 liegt, wird nur ein Zeichen in buffer kopiert und Länge von buffer ist dann 1! Somit ist strlen und strcpy hier unbrauchbar!
Das ist das Problem das ich weiter oben schon beschrieben hatte.

Und benutz bitte Code-Tags


mfg
umbrasaxum
 
Das mit
Code:
  char *buffer = "\0";
         	strcpy(buffer, InitString);
ist nicht nur nicht ratsam, sondern schlicht falsch. Du legst da einen Zeiger an, den du mit dem Wert 48 initialisierst. Da gehört kein Speicherbereich dazu. Genauso wie
Code:
char InitString[] = "\0"; 
      
                       InitString[0] = 0x02;
   InitString[1] = 0x00;
   InitString[2] = 0x02;
   InitString[3] = 0x70;
   InitString[4] = 0x72;
 InitString[5] = 0x03;
Hier wird ein einelementiges Array angelegt und das einzige Element mit 0 initialisiert. Die Zuweisungen ab InitString[1] werden in nicht allokierten Speicher geschrieben, überschreiben also evtl. andere Daten.
So wie Umbrasaxum das geschrieben hat, muß es sein.

Statt strcpy kannst du
Code:
memcpy(void * ziel, void * quelle, int groesse)
vberwenden, um den Inhalt eines Speicherbereiches in einen anderen zu kopieren. Für die Größe des Speicherbereiches und des zu übertragenden Datenblockes kannst du
Code:
sizeof(InitString)
verwenden.
 
Zurück