当我在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
。我需要检索这些数据:0x01,0x01,0xFF,0x3F,0x00,0x3F,0x08,它将显示在我的网站上..
当我改变这个
时write(fd,data[0],8); // Prints `ÿ ÿ^A ÿ^A`
到这个
write(fd,"010101FF3F003F08",15); // Prints 010101FF3F003F08 in PHP
然后我可以毫无问题地检索数据......
为什么显示为ÿ ÿ^A ÿ^A
?
答案 0 :(得分:2)
执行write(fd, data[0], 8)
时,您正在发送二进制数据流,即编码为0x01
,0x01
等的字符,而不是ASCII表示你的数据。
根据您的目标,您应该将它们作为ASCII字符串发送。要在PHP中处理它们,这是最简单的方法(但是它会丢失一半带宽,每8位传输4个有用位)。
for(int p=0; p<8; p++) {
fprintf(fd, "%02x", data[0][p]);
}
代替
write(fd, data[0], 8);