2011-01-07 85 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。調試這樣的網絡問題非常寶貴。