Использование файла PHP для записи в последовательный порт

Вопрос или проблема

Я использую старый 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.

Эти рекомендации обеспечат надежную работу вашего приложения и успешную передачу данных через последовательный порт.

Оцените материал
Добавить комментарий

Капча загружается...