2

PHPで16 進文字を読み取ると、この奇妙な出力が表示されます。ここで、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ですか?

4

1 に答える 1

2

を実行すると、データのASCII表現ではなく、 、 などでコードwrite(fd, data[0], 8)化された文字であるバイナリ データのストリームが送信されます。0x010x01

目的に応じて、ASCII 文字列として送信する必要があります。それらを PHP で処理するには、これが最も簡単な方法です (ただし、送信される 8 ビットごとに有効な 4 ビットで帯域幅の半分が失われます)。

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

代わりは

write(fd, data[0], 8);
于 2012-08-23T18:22:50.313 に答える