2013-10-11 3 views
5

편집 : 다음 스크립트 (여기에 발견 된 : PHP serial port data return from Arduino)로 일부 테스트를 수행했습니다./dev/ttyUSB0에 fwrite를 사용해도 새 명령과 장치에서 보낸 마지막 명령이 출력됩니다. 이것은 내가 시리얼 포트가 올바르게 설정되지 않았다고 생각하게한다. (예를 들어, 버퍼를 지우기 위해 설정을 변경하기 위해 stty를 사용해야 할 수도있다.) 그렇지 않으면/dev /에 버퍼를 지우는 데 필요한 다른 것이있다. 새로운 명령을 보내기 전에 ttyUSB0. 어떤 도움을 주시면 감사하겠습니다.PHP를 사용하여 직렬 포트에 쓰는 방법은 무엇입니까? 버퍼링 문제가 있습니다

$fp =fopen("/dev/ttyUSB0", "w+"); 
if(!$fp) { 
     echo "Error";die(); 
} 
fwrite($fp, $_SERVER['argv'][1] . 0x00); 
echo fread($fp, 10) . "\n"; 
fclose($fp); 

원래 질문 : 나는 시리얼 포트를 통해 장치와 통신 할 수 PHP 시리얼을 사용하고

. 이 장치는 모든 입출력을 화면의 직렬 포트에 표시하는 기능을 가지고 있습니다. 다음 스크립트를 실행하면 스크립트가 장치에서 모든 명령 출력을 가져 와서 장치에 다시 반복한다는 것을 장치에서 볼 수 있습니다. 이 문제로 인해 장치에 'OK'라고 대답하고 출력을 반복하지 않고 'OK'라고 말하면서 문제가 발생한다고 생각합니다. 같은 명령을 먼저 반복하면 혼란스럽고 'OK'명령을 따르지 않습니다. 루프를 사용하여 0.1 초마다 'OK'를 출력하여이 문제를 해결할 수 있지만 기기의 출력을 읽고 그에 따라 적절하게 응답합니다. 나는 내 명령에 명령을 되풀이 할 것을 말하고있는 것이 아무것도 없다고 생각한다. 이 문제는 누구든지 경험 한 PHP 직렬 클래스 문제입니까? 나는 $ autoflush = false 설정을 시도했다; 차이는 없습니다.

내 스크립트 장치 화면에

Tx: AT 
Tx: AT&F 
Tx: ATE0 
Tx: AT+IPR=9600 
Tx: AT 
Tx: AT 
Tx: AT 
Tx: ATH0 
Tx: AT+CMGF=1 

예 출력 내 스크립트가 실행되는 동안 : 내 스크립트를 실행하기 전에 장치 화면에

require_once('php_serial.class.php'); 

$serial = new phpSerial; 
$serial->deviceSet('/dev/ttyUSB0'); 
$serial->confBaudRate(9600); 
$serial->confParity("none"); 
$serial->confCharacterLength(8); 
$serial->confStopBits(1); 
$serial->confFlowControl("none"); 

$serial->deviceOpen(); 

while (true) { 
    $read = $serial->readPort(); 
    if ($read) { 
     echo date("r") . '  ' . $read; 
//  $serial->sendMessage("\r\nOK\r\n"); 
    } 
} 

$serial->deviceClose(); 

예 출력

Tx: AT 
Rx: AT 
Tx: AT&F 
Rx: AT&F 
Tx: ATE0 
Rx: ATE0 
Tx: AT+IPR=9600 
Rx: AT+IPR=9600 
Tx: AT 
Rx: AT 
Tx: AT 
Rx: AT 
Tx: AT 
Rx: AT 
Tx: ATH0 
Rx: ATH0 
Tx: AT+CMGF=1 
Rx: ^[AT+CMGF=1 

답변

0

minicom을 설치하고 포트를 열기 전에 시도하십시오 :

$sms="ttyUSB0"; 
exec("minicom -b 9600 -o -D /dev/" . $sms);