Time.h & processSyncMessage() itoa ?

Hallo,
ich nutze die <Time.h> und die im Beispiel beschriebene
void processSyncMessage()

Leider funktioniert das bei mir nicht die zeit über den Com Port zu syncroniesieren.
Beim senden von T1410050314 also 14:10 05.03.14 stellt sich die Zeit auf irgendwas um..

char pctime[10]; = 1410050314

Nun versuche ich selbst die Funktion setTime() aufzurufen um die werte zu übergeben, und es passiert der gleiche blödsinn, weil pctime[0] eben nicht 1 sondern 49 in der Ascii tabelle ist.
setTime(pctime[0] + pctime[1] ,00,pctime[4] + pctime[5],pctime[6] + pctime[7], pctime[8] + pctime[9]);

..und nun verbringe ich 2 Tage damit pctime[0] + pctime[1] aber eben nicht den Ascii wert 049 & 052 sondern Ihren wert 1 + 4..

itoa habe ich nun auch ausprobiert, aber dabei bekomme ich ja wieder ein char[] zurück, und das habe ich ja schon...

Wie bekomme ich aus dem Ascii wert 049 eine "1" hin?

Danke schonmal vorab für hilfe. :slight_smile:

alles klar... nun habe ich es..

 int T_hr =pctime[0] - '0'

Warum -'0' habe ich nun nicht begriffen, aber es funktioniert..

: - )

[EDIT]

Und hier nochmal im ganzen.. bin bestimmt nicht der einzige der da auf das Problem stößt?

void processSyncMessage() {
  while(Serial.available() >=  TIME_MSG_LEN ){  
    char c = Serial.read() ;
      if( c == TIME_HEADER ) {    
		char pctime[10];
		for(int i=0; i < TIME_MSG_LEN -1; i++){
			c = Serial.read();	
			if( isDigit(c)) {    
			pctime[i] = c ;
			}
      }
	  
	 int T_hr =(pctime[0] - '0') * 10 +  (pctime[1] - '0');
	 int T_min =(pctime[2] - '0') * 10 +  (pctime[3] - '0');
	 int T_sec = 0;
	 int T_day = (pctime[4] - '0') * 10 +  (pctime[5] - '0');
	 int T_mon = (pctime[6] - '0') * 10 +  (pctime[7] - '0');
	 int T_yea = (pctime[8] - '0') * 10 +  (pctime[9] - '0');

      setTime(T_hr,T_min,T_sec,T_day,T_mon, T_yea);   // Sync clock to the time received on serial port
    }
  }
}

Schau dir mal die ASCII Tabelle an:

'0' hat den ASCII Code 48, bzw. 0x30. Wenn man das also von einem char abzieht der eine Zahl ist, hat man deren Wert.

Ahhh... Danke Serenifly.. Das macht sinn..

Wie verfahre ich denn mit Buchstaben? Nicht das ich dies nun bräuchte, aber mal rein aus Interesse? Gibt es eine denn Funktion die mir aus einem Char = 065 ein "A" ausgibt?

Alle sagen ja Strings sind schlecht für den Speicher, daher würde ich ja schon gerne grundsätzlich mit Char Arrays arbeiten wollen.

Das hier geht:

char c = 'A';
Serial.println(c);

Wenn es nur um eine Ausgabe geht muss man nichts wandeln. Das ist ein char. Ein C-String ist ein char* (Zeiger auf char). Der Compiler kann das also unterscheiden und eine andere Version von println() aufrufen.

Ansonsten um daraus einen Null-terminierten String zu machen:

char c = 'A';
char str[] = { c, '\0' };

Aber wie gesagt, nicht unbedingt nötig

Und Arduino String Objekte sind nicht nur wegen der dynamischen Speicher Allozierung problematisch. Sie sind einfach zu kaum was zu gebrauchen und zu nichts kompatibel. Das einzige schöne ist dass man Strings einfach konkatenieren kann. Aber das war es dann auch schon. Mit C Strings und den Funktionen in der avr libc lässt sich sehr viel mehr machen wenn es Formatierung oder Konvertierung geht:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Das ist zum Teil mit der Standard C Lib kompatibel. Man kann also für viele Funktionen auch bessere Seiten zur Erklärung verwenden:
http://www.cplusplus.com/reference/cstdlib/
http://www.cplusplus.com/reference/cstring/

Eine einfache und schöne Lösung für das Konkatenieren von Serial Ausgaben ist das hier:
http://arduiniana.org/libraries/streaming/
Das gaukelt einem einen C++ Output Stream vor in dem es den << Operator überlad und inline mit print() ersetzt. Eigentlich sollte das in der Arduino IDE standardmäßig drin sein.

In der SdFat Lib gibt es auch richtige Output und Input Streams