在串行读取十六进制数据时,PHP中的奇怪输出


Weird output in PHP when reading hex data in serial

当我在PHP中读取十六进制字符时,我会得到这种奇怪的输出,其中PHP从Arduino serial中获取数据。。

这是输出。。

ÿ ÿ^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,0x1,0xFF,0x3F,0x00,0x3F,0x08,这些数据将显示在我的网站上。。

当我更改此时

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

到这个

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

那么我可以毫无问题地检索数据。。。

为什么它显示得像ÿ ÿ^A ÿ^A

执行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);