2012-08-23 25 views
2

我有,當我在PHP,其中PHP獲取從Arduino的串行其數據讀取的十六進制字符這個奇怪的輸出十六進制數據時..古怪的輸出讀取串口

下面是輸出..

ÿ ÿ^A ÿ^A 

我寫了一個用於將數據發送給Arduino的用戶空間應用程序。

這裏是我的用戶空間應用程序的示例代碼:

unsigned char data[2][7] = {{0x01,0x01,0xFF,0x3F,0x00,0x3F,0x08}, 
          {0xFF,0x01,0x02,0xFF,0x00,0x2F,0x10}}; 

fd=open("/dev/ttyS0",O_RDWR | O_NOCTTY); 
if(fd<0) 
    exit(1); 

if (strcmp(argv[1], "go up")==0) { 
    write(fd,data[0],8); // What I used to send data to my Arduino.. 
} 

下面是我用從Arduino的獲取數據什麼的樣本PHP代碼:

$sCon = $sConnect->SerialConnect("/dev/ttyS0", 9600); 
shell_execute("test 'go up'"); //Test is the name of my user space application 
usleep(100000) 
$data .= fread($sCon, 25);  // Get the data from the Arduino.. 
$sConnect->SerialClose($sCon); 

現在,當我運行它,頁面上顯示的數據是搞砸了:ÿ ÿ^A ÿ^A。我需要找回這些數據:當我改變這個

write(fd,data[0],8); // Prints `ÿ ÿ^A ÿ^A` 

這個

0x01,0x01,0xFF,0x3F的,0x00,0x3F,0x08的,這將在我的網站上顯示..

write(fd,"010101FF3F003F08",15); // Prints 010101FF3F003F08 in PHP 

那麼我可以取回,沒有任何問題的數據...

爲什麼顯示像ÿ ÿ^A ÿ^A

回答

2

當你做write(fd, data[0], 8),你要發送的二進制數據流,這是一種被編碼0x010x01,等等,不是ASCII數據的代表性人物。

根據您的目標,您應該將它們作爲ASCII字符串發送。爲了在PHP中處理它們,這是最簡單的方法(但是它會失去一半的帶寬,每發送8位 位有4個有用位)。

for(int p=0; p<8; p++) { 
    fprintf(fd, "%02x", data[0][p]); 
} 

代替

write(fd, data[0], 8); 
+0

謝謝。感謝澄清了,但編譯代碼時,先生進出口得到一個錯誤.. GCC -0測試test.c的 警告傳遞參數1的fprintf使得指針從整數沒有投.. – demic0de

+0

fd是一個整數...我怎麼能使它在fprintf工作? – demic0de

+0

通過將fprintf更改爲dprintf來實現它:) – demic0de