无法使用fopen或php_serial.class.php写入/ dev / ttyUSB0

时间:2013-12-13 22:20:24

标签: php c ubuntu usb usbserial

我正在尝试将此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上运行)

Antenna Plugged into the USB on Linux (/dev/ttyUSB0)

我尝试使用以下命令查看内容无效(当我使用root权限在该计算机上运行php代码时):

screen /dev/ttyUSB0 19200
od -x < /dev/ttyUSB0

如何通过/ dev / ttyUSB0使用php发送消息并接收该消息?或者至少有一些简单的测试来确认发送的内容,实际上可以被阅读。

1 个答案:

答案 0 :(得分:0)

在C程序中write(tty_fd,&packet2send,34); i。即34个字节。在PHP脚本中,fwrite($fp, $request_packet_ok);其中$request_packet_ok是一个105字节的字符串。显然,您错误地以十六进制空格分隔表示形式发送消息,而您应该将其作为原始字节发送。