2011-01-07 90 views
2

我正在使用Arduino(duemilanove)和官方以太网屏蔽层向控制器发送数据以控制LED矩阵。我试图通过在桌面上的32位值中的4个字节发送一些原始的32位无符号整型值(unix时间戳)给控制器,并将它作为4个连续字节发送给arduino。但是,只要字节值大于127,以太网客户端库的返回值就是63.Arduino以太网字节大小问题

以下是我在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!起初我认为问题还在后面(缓冲区是字符而不是字节),但是当我在读取后立即打印出“数据”时,它仍然是63.

任何想法可能导致这种情况?我知道client.read()应该输出int并在内部从套接字读取数据作为uint8_t这是一个完整的字节和无符号,所以我应该能够至少去255 ...

编辑:对,你是汉斯。没有意识到Encoding.ASCII.GetBytes只支持前7位而不是全部8.

+0

UTF-8编码不会给一个63 ...做一个63也会产生63出?随后的字节是否完全移动。 – 2011-01-07 05:26:13

回答

3

63是?的ASCII码。与值有一些相关性,ASCII没有超过127的值的字符代码。ASCII编码器通常用一个问号替换这样的无效代码。例如,.NET Encoding.ASCII编码器的默认行为。

这并不完全清楚可能发生的情况。绝对不在你的片段中。可能在电线的另一端。写字节,而不是字符。

4

我更倾向于怀疑发送端。你是积极的发射端工作正常吗?你用wirehark捕获或一些这样的验证吗?

+0

为wireshark建议+1。 – 2011-01-07 05:22:34

0

+1为Hans Passant和Karl Bielefeldt。

你可以发送没有编码的数据吗?数据如何发送? TCP/UDP/IP /以太网绝对支持无限制地发送二进制数据。如果这是不可能的,也许将数据转换为十六进制将解决问题。 Base64也可以工作(更好),但是工作量相当大。对于少量的数据,十六进制可能是最简单和最快的解决方案。

再次给卡尔和本提一下wireshark。调试这样的网络问题非常宝贵。