PhpSerial: нет доступного stty – возможно, он работает

Я работаю над проектом, который включает в себя чтение и запись на последовательную плату, используя контакты UART на моей малиновой пи. Тем не менее, я уже ударил кирпичную стену. Каждый раз, когда я пытаюсь использовать PhpSerial я всегда получаю ошибку:

Неустранимая ошибка: нет доступной stty, не может работать. в /var/www/PHP-Serial/examples/PhpSerial.php в строке 56

Я пробовал множество конфигураций с помощью ввода:

 // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); - // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); - // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); - // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); - // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); для // First we must specify the device. This works on both linux and windows (if // your linux serial device is /dev/ttyS0 for COM1, etc) $serial->deviceSet("/dev/ttyAMA0"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(38400); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); 

php/lighthttpd работает как www-data, Ive пробовал использовать /dev/ttyAMA0 для этого пользователя, и я добавил группу dialout к указанному пользователю. Я не вижу никаких отключенных функций или чего-либо в моем php.ini. У меня также нет стандартной установки для использования последовательных устройств на пи в соответствии с вики, и я могу читать / записывать данные в и из схемы, используя

sudo minicom -b 38400 -o -D / dev / ttyAMA0

Вот строка (строки), на которую ссылается ошибка:

  if (substr($sysName, 0, 5) === "Linux") { $this->_os = "linux"; if ($this->_exec("stty") === 0) { register_shutdown_function(array($this, "deviceClose")); } else { trigger_error( "No stty availible, unable to run.", E_USER_ERROR ); } 

Я не могу понять это, но кто-то другой. Заранее спасибо.

Решение вашей проблемы выглядит следующим образом:

Вы должны изменить следующую строку кода в классе PhpSerial.php

ИЗ:

 if ($this->_exec("stty") === 0) { 

TO:

 if ($this->_exec("stty --version") === 0) { 

=> Следовательно, это устраняет ошибку «Нет stty availible, failed to run …». См. Эту тему: https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=100481

Я также должен добавить, что мне пришлось отложить задержку до того, как я напишу серийные данные, например

 <?php 

error_reporting (E_ALL); ini_set ('display_errors', '1');

 include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; для include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; - include "PhpSerial.php";//serial class: https://github.com/Xowap/PHP-Serial/blob/develop/examples/VS421CPNTA.php $serial = new phpSerial; //$serial->deviceSet("/dev/ttyAMA0"); $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->deviceOpen(); sleep(3);//delay $serial->sendMessage("1"); $serial->deviceClose(); echo "Serial message sent! \n"; 

Поскольку вы можете видеть, что PhpSerial нуждается в утилите stty для получения / установки последовательных параметров, таких как скорость передачи, четность и т. Д. Решение заключается в установке stty с помощью вашего дистрибутива Linux

STTY на Rasbian возвращает 1 на exec, а не 0

К сожалению, если вы просто обойдете этот код, он зависает на register_shutdown_function.

В настоящее время я пишу файлы на диск и пытаюсь отправить их в порт (борется, потому что они двоичный текст, а не ascii). Если у вас есть информация о ascii для отправки, тогда

  stty -F /dev/ttyAMA0 38400 

А также

  exec("cat filename.txt > //dev//ttyAMA0");