I’m using an Arduino (duemilanove) with the official Ethernet shield to send data to the controller for controlling an LED matrix. I am trying to send some raw 32-bit unsigned int values (unix timestamps) to the controller by taking the 4 bytes in the 32-bit value on the desktop and sending it to the arduino as 4 consecutive bytes. However, whenever a byte value is larger than 127, the returned value by the ethernet client library is 63.
The following is a basic example of what I’m doing on the arduino side of things. Some things have been removed for neatness.
byte buffer[32];
memset(buffer, 0, 32);
int data;
int i=0;
data = client.read();
while(data != -1 && i < 32)
{
buffer[i++] = (byte)data;
data = client.read();
}
So, whenever the input byte is bigger than 127 the variable “data” will end up getting set to 63! At first I thought the problem was further down the line (buffer used to be char instead of byte) but when I print out “data” right after the read, it’s still 63.
Any ideas what could be causing this? I know client.read() is supposed to output int and internally reads data from the socket as uint8_t which is a full byte and unsigned, so I should be able to at least go to 255…
EDIT: Right you are, Hans. Didn’t realize that Encoding.ASCII.GetBytes only supported the first 7 bits and not all 8.
63 is the ASCII code for ?. There’s some relevance to the values, ASCII doesn’t have character codes for values over 127. An ASCII encoder commonly replaces invalid codes like this with a question mark. Default behavior for the .NET Encoding.ASCII encoder for example.
It isn’t exactly clear where that might happen. Definitely not in your snippet. Probably on the other end of the wire. Write bytes, not characters.