Dringend! char 0 versaut mir restliche Daten!!!
-
Hallo,
ich habe ein Problem und ver suche schon den ganzen Morgen es zu lösen, aber ich weiß jetzt nicht mehr weiter. Hab auch schon in versch FAQs und in Foren gesucht aber nichts ähnliches gefunden.
Mein Problem:
ich kopiere einen CString in ein char[16]
sobald in meinem String eine 0 auftaucht, kommt bei den restlichen Feldern nur wirre Zahlen und Zeichenhier mal etwas CODe:
BOOL CSerialPort::SendData(char *ID, int msgtype, CString message, int toDeskID) { //NEU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SetCommMask(hPort,EV_CTS ); //EV_CTS: Clear to send Signal changed State. if(EV_CTS) { //Länge der gesendeten Daten unsigned long length=0; //Feld von 16 char werten (Datarange char=1Byte!!!) char tosend[16]; //in msg stehen die Charakters also Zeichen!(z.B Zeichen mit Dezimalwert 78: N) CString msg; msg+=(ID); //Messageheader msg+=(char)msgtype; //Messagetyp msg+=message; //eigentliche Nachricht //Kopieren der Nachricht in char- Feld tosend wcstombs(tosend, (LPCTSTR)msg, 10); //msg für checksum erweitern msg+=(char)13; msg+=(char)0; msg+=(char)1; msg+=(char)1; msg+=(char)toDeskID; msg+=(char)32; //Erstellen einer Checksumme, um falsche Nachrichten zu vermeiden int chksum2=0; for (int ii=0;ii<msg.GetLength();ii++) chksum2=chksum2 ^ (int)(msg.GetAt(ii)); //Charackters für Sendedaten hinzufügen /siehe oben tosend[9]=(char)13; tosend[10]=(char)0; tosend[11]=(char)1; tosend[12]=(char)1; tosend[13]=(char)toDeskID; tosend[14]=(char)32; tosend[15]=(char)chksum2; //Cheksumme als letztes Byte anhängen //Senden der Daten: 16Bytes werden gesendet ohne Unterbrechung WriteFile(hPort, tosend, 16, &length, NULL); } return TRUE; }
Im Debugmodus geschieht folgendes:
to send sieht dann so aus:
tosend[0]='N' tosend [1]='W', tosend[2]='1'
jetzt wird die Message zugefügt: z.B. message="DAN0# " die 0 steht für den Index eines Kanals(darf ich nicht ändern, wird von µC erwartet)
nach der 0 sind die restlichen Werte in tosend falsch!!!sobald die message keine 0 mehr enthält ist alles richtig!!!
liegt das an der wcstombs?
hab versucht nur mit chars zu arbeiten aber das Ergbnis ist das gleiche!?????????
-
Ist das dort das Zeichen '\0' = ASCII 0 oder '0'? Das Zeichen '\0' dient als Stringende-Marke und wird von den üblichen Stringverarbeitungsroutinen (inclusive wcstombs) als Signal verstanden, daß der Text hier zu Ende ist.
-
CStrings werden immer null-terminiert... deshalb geht Dein String auch nur bis zu dem 0-Zeichen...
Versuch es mal mit einem Array (char)...
-
CStoll schrieb:
Ist das dort das Zeichen '\0' = ASCII 0 oder '0'? Das Zeichen '\0' dient als Stringende-Marke und wird von den üblichen Stringverarbeitungsroutinen (inclusive wcstombs) als Signal verstanden, daß der Text hier zu Ende ist.
tosend[9]=(char)13; tosend[10]=(char)0; //<- ende des Arrays tosend[11]=(char)1; tosend[12]=(char)1; tosend[13]=(char)toDeskID; tosend[14]=(char)32; tosend[15]=(char)chksum2;
-
Was für ein Array... Du hast einen String!
-
habs selbst rausgefunden:
if(EV_CTS) { //Länge der gesendeten Daten unsigned long length=0; //Feld von 16 char werten (Datarange char=1Byte!!!) char tosend[16]={0}; //Header ID anhängen strncat(tosend, ID, 2); //Messagetyp anhängen tosend[2]=(char)msgtype; //Nachricht anhängen tosend[3]=message[0]; tosend[4]=message[1]; tosend[5]=message[2]; tosend[6]=message[3]; tosend[7]=message[4]; tosend[8]=message[5]; //Charackters für Sendedaten hinzufügen /siehe oben tosend[9]=(char)13; tosend[10]=(char)0; tosend[11]=(char)1; tosend[12]=(char)1; tosend[13]=(char)toDeskID; tosend[14]=(char)32; //Erstellen einer Checksumme, um falsche Nachrichten zu vermeiden int chksum2=0; for (int ii=0;ii<15 ;ii++) chksum2=chksum2 ^ (int)tosend[ii]; tosend[15]=(char)chksum2; //Cheksumme als letztes Byte anhängen //Senden der Daten: 16Bytes werden gesendet ohne Unterbrechung WriteFile(hPort, tosend, 16, &length, NULL); } return TRUE;
so erkennt er char 0 nicht als Stringende!!
danke für die Tips
-
Jochen Kalmbach schrieb:
Was für ein Array... Du hast einen String!
und was ist ein String!?
mal abgesehen davon das die stelle an der ichs geschrieben hab blödsinn war
-
Hab mich im Namen verlesen... sorry...