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 Zeichen

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


Anmelden zum Antworten