Teensy 2.0 String() bug?

ian

Well-known member
I've just ported a program for an Arduino to Teensy 2 & it failed. I've narrowed the issue to a problem with String() which doesn't seem to like variables declared as byte.
This seems to work just as I'd expect with an Arduino & a Teensy 3.1. Sketch below illustrates:


Code:
byte data_1=22;  //doesn't print
int8_t data_2=33;  //does print
uint8_t data_3=44;  //doesn't print

void setup() {

  Serial.begin(9600);
}

void loop() {

  Serial.println(String(data_1));
  Serial.println(String(data_2));
  Serial.println(String(data_3));
  delay(1000);

}
 
22 is a non-printing control character. I changed them to this:
Code:
byte data_1=35;  //doesn't print
int8_t data_2=33;  //does print
uint8_t data_3=44;  //doesn't print
which prints
Code:
#
33
,

Teensy 2 - 1.6.1 - TD 1.21
Pete
 
Let's keep it simple. Arduino reference page for String() -
HTML:
http://arduino.cc/en/Reference/StringConstructor
Here is a better(?) illustration:

Code:
byte data1=55;  //all the same
int8_t data2=55;
uint8_t data3=55;
uint16_t data4=55;

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println(String(data1));  //prints 7 on T2 :(
  Serial.println(String(data2));  //prints 55 on T2 :)
  Serial.println(String(data3));  //prints 7 on T2 :(
  Serial.println(String(data4));  //prints 55 on T2 :)

  delay(3000);
}

Teensy 2 isn't happy with 'bytes'
Teens3 & Arduino work just as I'd expect and prints 55 each time.
 
Ian:
There's one variation you didn't try.
Code:
byte data1=55;  //all the same
int8_t data2=55;
uint8_t data3=55;
uint16_t data4=55;
char data5=55;

void setup() {
  Serial.begin(9600);
  while(!Serial);
  delay(1000);
}

void loop() {
  Serial.println(String(data1));  //prints 7 on T2 :(
  Serial.println(String(data2));  //prints 55 on T2 :)
  Serial.println(String(data3));  //prints 7 on T2 :(
  Serial.println(String(data4));  //prints 55 on T2 :)
  Serial.println(String(data5));
  delay(3000);
}
On T2 this prints 7 55 7 55 7. On T3.1, T-LC and Arduino Nano this prints 55 55 55 55 7
On a T2, the Wstring.cpp code treats char and unsigned char the same way and prints '7' for both. On the others, their Wstring.cpp code treats unsigned char the same as an integer and prints 55 but a char is still printed as a '7'.
I don't know why this difference exists.
I also haven't delved into why 'int8_t' isn't treated the same as a 'char'. They are both a signed 8-bit character.

Pete
 
Last edited:
Back
Top