2013-12-13 1 views
0

나는 PHP로이 C 스크립트를 다시 작성하는 것을 시도하고있다. (샘플)는하면 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을 16 진수로 표시하지만 쓰기에 문제가 있습니다 (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에 글을 쓰고 그 글에서 내가 쓴 글을 읽으려고한다.

나는 아무 권한이 거부하지 얻고, 안테나가 부착 된 이미지처럼 보이는

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

난 다음을 사용하여 시도 (우분투에서 실행하는 데 필요한 당신을 보여주기 위해 창에 연결) (나는 그 기계를 사용 루트 권한에 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 바이트의 문자열입니다. 분명히 실수로 16 진수로 공백으로 구분 된 표현으로 메시지를 보내는 반면, 원시 바이트로 보내야합니다.