Вопрос или проблема
Я использую старый php_serial.class.php, который можно найти здесь: текст. Я заменил фигурные скобки на квадратные и использовал следующий код в моем другом PHP файле, и вот ответ: “
[php:warn] [pid 1018:tid 1018] [client ::1:55892] PHP Warning: Устройство должно быть настроено перед тем, как его открыть в /var/www/html/php_serial.class.php на строке 167, реферер: http://localhost./
Буду очень благодарен за любую помощь:
<?php
include "php_serial.class.php";
$totalHundreds=$_POST['totalHundreds'];
$totalTens=$_POST['totalTens'];
$totalOnes=$_POST['totalOnes'];
$wicketsOnes=$_POST['wicketsOnes'];
$oversTens=$_POST['oversTens'];
$oversOnes=$_POST['oversOnes'];
$batsmanaHundreds=$_POST['batsmanaHundreds'];
$batsmanaTens=$_POST['batsmanaTens'];
$batsmanaOnes=$_POST['batsmanaOnes'];
$batsmanbHundreds=$_POST['batsmanbHundreds'];
$batsmanbTens=$_POST['batsmanbTens'];
$batsmanbOnes=$_POST['batsmanbOnes'];
$targetHundreds=$_POST['targetHundreds'];
$targetTens=$_POST['targetTens'];
$targetOnes=$_POST['targetOnes'];
$total=$totalHundreds.$totalTens.$totalOnes;
$overs=$oversTens.$oversOnes;
$batsmana=$batsmanaHundreds.$batsmanaTens.$batsmanaOnes;
$batsmanb=$batsmanbHundreds.$batsmanbTens.$batsmanbOnes;
$target=$targetHundreds.$targetTens.$targetOnes;
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyACM0");
#$serial->deviceSet("/dev/ttyAMA0");
$serial->confBaudRate(57600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$tempString="4,".$batsmana.",".$total.",".$batsmanb.",".$wicketsOnes.",".$overs.",".$target."#";
#echo($tempString."<br>");
$serial->deviceOpen();
$serial->sendMessage($tempString);
$serial->deviceClose();
echo("Итого: " . $total . " за " . $wicketsOnes . " выходов из " . $overs . " оверов. Цель: " . $target . ". Бэтсмен A: " . $batsmana . ", бэтсмен B: " . $batsmanb);
print_r($_POST);
?>
Я проверил, и ‘admin'(не www-data) является пользователем PHP, и я добавил его в группу dialout, я проверил группу dialout для подтверждения, я пробовал:
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyACM0");
#$serial->deviceSet("/dev/ttyAMA0");
$serial->confBaudRate(57600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
Но это, похоже, не дает управление последовательным устройством, поскольку оно не открывается. Вот ответ:
object(phpSerial)#1 (7) {
["_device"]=>
NULL
["_windevice"]=>
NULL
["_dHandle"]=>
NULL
["_dState"]=>
int(0)
["_buffer"]=>
string(0) ""
["_os"]=>
string(0) ""
["autoflush"]=>
bool(true)
}
.
Ответ или решение
Использование PHP для записи в последовательный порт: Решение проблемы с php_serial.class.php
Ваша проблема с библиотекой php_serial.class.php
и сообщением об ошибке "The device must be set before to be open" предполагает, что последовательное устройство не было правильно задано перед открытием порта. Давайте рассмотрим, как правильно установить устройство, а также некоторые возможные причины и решения вашей проблемы.
Шаг 1: Устанавливаем последовательное устройство
Убедитесь, что вы задаете правильный путь к последовательному устройству. Для Linux системы это может быть что-то вроде /dev/ttyACM0
или /dev/ttyAMA0
, в то время как для Windows устройства могут быть вида COM1
, COM2
и т.д.
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyACM0"); // проверьте, чтобы путь к порту был правильным
Шаг 2: Проверка прав доступа
Как вы уже упомянули, убедитесь, что пользователь, под которым запущен PHP, имеет необходимые права доступа к последовательному устройству. Для этого выполните следующую команду в терминале:
ls -l /dev/ttyACM0
Если у пользователя, под которым работает Apache (обычно www-data
), нет прав на доступ к устройству, добавьте его в группу dialout
, как вы и делали. После изменения группы, вам нужно будет перезагрузить сервер:
sudo usermod -a -G dialout www-data
sudo systemctl restart apache2
Шаг 3: Проверка конфигурации порта
Проверьте настройки порта, которые вы используете. Вот пример как правильно установить конфигурацию:
$serial->confBaudRate(57600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
Убедитесь, что эти параметры соответствуют настройкам вашего устройства.
Шаг 4: Открытие устройства и отправка данных
Убедитесь, что вы открываете устройство после установки всех необходимых параметров:
if ($serial->deviceOpen()) {
// Устройство открыто, можно отправлять данные
$serial->sendMessage($tempString);
$serial->deviceClose();
} else {
echo "Не удалось открыть устройство.";
}
Изменяя код таким образом, вы сможете отловить возможные ошибки при открытии порта.
Шаг 5: Отладка
Если проблема сохраняется, добавьте отладочную информацию после каждой ключевой операции. Это даст вам представление о том, где и почему ваш код может «ломаться»:
if (!$serial->deviceOpen()) {
echo "Ошибка: устройство не удалось открыть";
exit;
}
Заключение
Следуя вышеуказанным шагам, вы сможете настроить и отладить свой PHP-скрипт для работы с последовательным портом. Не забывайте, что доступ к устройствам может быть нарушен из-за прав пользователей и других системных настроек. Убедитесь, что все изменения применены, и протестируйте их. Если после всех действий проблема не решается, рассмотрите возможность использования более современных библиотек или средств, таких как phpSerialPort
или symfony/process
.
Эти рекомендации обеспечат надежную работу вашего приложения и успешную передачу данных через последовательный порт.