2013-12-13 56 views
0

我想這個C腳本改寫成PHP。(樣品)無法使用的fopen寫入到/ dev/ttyUSB0或php_serial.class.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:

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,而不是將郵件發送到一個恆溫器:

$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嘗試使用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的消息和接收消息很?或者至少有一些簡單的測試來確認發送的內容是否可以真正閱讀。

+0

您確定您的設備使用rts/cts進行流量控制而不是「無」嗎? –

+0

是的,或者這就是軟件工程師所說的。有沒有辦法檢查? – Drace

回答

0

在C程序中你write(tty_fd,&packet2send,34); i。即34個字節。在您的PHP腳本中,您的fwrite($fp, $request_packet_ok);其中$request_packet_ok是105字節的字符串。很明顯,您錯誤地以十六進制空格分隔表示形式發送消息,而您應該將其作爲原始字節發送。