我正在使用带有官方以太网屏蔽的Arduino(duemilanove)将数据发送到控制器以控制LED矩阵。我试图通过获取桌面上32位值中的4个字节并将其作为4个连续字节发送到arduino来向控制器发送一些原始的32位无符号int值(unix时间戳)。但是,只要字节值大于127,以太网客户端库返回的值就是63。
以下是我在arduino方面做的事情的基本示例。为了整洁,有些东西被删除了。
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();
}
因此,只要输入字节大于127,变量“data”将最终设置为63!起初我认为问题是在线下(缓冲区曾经是char而不是字节)但是当我在读取后立即打印出“数据”时,它仍然是63。
任何可能导致这种情况的想法?我知道client.read()应该输出int并在内部从套接字读取数据uint8_t这是一个完整的字节并且是无符号的,所以我应该能够至少转到255 ......
编辑:对,你好,汉斯。没有意识到Encoding.ASCII.GetBytes只支持前7位而不是全部8位。
答案 0 :(得分:4)
我更倾向于怀疑传输方面。您是否肯定传输端正常工作?您是否通过wirehark捕获或某些此类验证?
答案 1 :(得分:3)
63是?的ASCII码。与值有一些相关性,ASCII没有超过127的值的字符代码.ASCII编码器通常用问号替换这样的无效代码。例如,.NET Encoding.ASCII编码器的默认行为。
目前尚不清楚可能发生的地方。绝对不在您的代码段中。可能在电线的另一端。写字节,而不是字符。
答案 2 :(得分:0)
+1 Hans Passant和Karl Bielefeldt。
您可以直接发送数据吗?如何发送数据? TCP / UDP / IP /以太网绝对支持无限制地发送二进制数据。如果这不可能,可能将数据转换为十六进制将解决问题。 Base64也可以工作(更好),但工作量要大得多。对于少量数据,hex可能是最简单,最快速的解决方案。
再次给Karl和Ben提及wireshark。对调试这样的网络问题非常宝贵。