我正在尝试将此C脚本重写为PHP。(示例)
// send packet to network
tty_fd=open(buf50, O_RDWR | O_NOCTTY | O_SYNC);
write(tty_fd,&packet2send,34);
close(tty_fd);
这个C脚本也从十六进制的/ dev / ttyUSB0中读取数据但是我在写入时遇到了麻烦(在php中)。
我已经能够成功阅读,但我担心写作不起作用 - 或者我无法看到我写的内容。
我用过fopen:
$request_packet_ok = dechex(ord("~")). " 02 ff ff 07 ff ab 2c 4d 65 73 73 61 67 65 20 43 43 20 23 31 2f 34 20 20 20 20 ff ff d2 d7 00 00 b5 7a\r"; //Means "Message CC #1/4" on the thermostat
$device = "/dev/ttyUSB0";
if (is_writable($device)) {
echo "\n".'The file is writable'."\n";
$fp =fopen($device, "w+");
if( !$fp) {
echo "Error";die();
}
while(true){
echo "\n".'writing: '.$request_packet_ok;
fwrite($fp, $request_packet_ok);
$packet='';
$var = fread($fp, 35);
for ($i=0; $i < strlen($var);$i++){
$packet .= dechex(ord( substr($var,$i,1) ) );
}
var_dump($packet);
}
fclose($fp);
我也尝试过使用php_serial.class.php:
define('PACKET_SIZE_LIMIT',70);
$serial = new phpSerial;
$serial->deviceSet('/dev/ttyUSB0');
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("rts/cts");
$serial->deviceOpen();
$starttime = microtime(true);
$sof='~';
$packet = '';
$output = '';
while (true) {
$read = $serial->readPort();
if ($read) {
while (strlen($output) < PACKET_SIZE_LIMIT){
for($i = 0; $i <strlen($read);$i++){
$each_char = substr($read,$i,$i+1);
if ( strlen(dechex(ord($each_char))) != 2 ){
$output.= sprintf('%02d',dechex(ord($each_char)));
}else{
$output.= dechex(ord($each_char));
}
}
$read = $serial->readPort();
}
echo $output;
}
}
$serial->deviceClose();
目的是使用PHP而不是使用C代码将消息发送到恒温器。
由于我能够使用php读取天线发送的数据包,我假设我可以访问/ dev / ttyUSB0来写但是由于某种原因,我永远看不到我发送/写入的内容天线(将文本消息发送到恒温器显示器 - 不会发生)。我也没有任何错误......
我正在寻找/ dev / ttyUSB0,然后阅读我写的内容(检查它是否有效 - 作为测试)。
我没有得到任何许可被拒绝,并且天线看起来像附加的图像(将其插入窗口向您显示,它需要在Ubuntu上运行)
我尝试使用以下命令查看内容无效(当我使用root权限在该计算机上运行php代码时):
screen /dev/ttyUSB0 19200
od -x < /dev/ttyUSB0
如何通过/ dev / ttyUSB0使用php发送消息并接收该消息?或者至少有一些简单的测试来确认发送的内容,实际上可以被阅读。
答案 0 :(得分:0)
在C程序中write(tty_fd,&packet2send,34);
i。即34个字节。在PHP脚本中,fwrite($fp, $request_packet_ok);
其中$request_packet_ok
是一个105字节的字符串。显然,您错误地以十六进制空格分隔表示形式发送消息,而您应该将其作为原始字节发送。