3

Работа с UART в LINUX + PHP

требуется помощь лиги IT

Делаю небольшую поделку - проект умного дома.

В основе ардуино + одноплатник orangepi zero

на одноплатнике стоит armbian и поднят httl сервер.

на сервере страничка с кодом ajax по таймеру делает запрос через php и соответственно получает ответ. все работает до тех пор, пока есть ответ.

если ответа нет, то на третьем-четвертом запросе сервер наглухо виснет.

запрос делаю так (пробовал все три варианта):

$bufft = fgets($fp,7);

//$bufft = fread($fp,7);

//$bufft = stream_get_line($fp,7); + //stream_set_timeout($fp, 0, 15000);

(где: $filename = "/dev/ttyS1"; //порт $fp = fopen($filename, "w+"); )

Насколько я понимаю, проблема в том, что при отсутствии ответа в буфере /dev/ttyS1 нет вообще ничего, те нет в файле даже символа конца строки (файла). и считывание идет по бесконечному циклу, пока не повесит процесс.

Экспериментально установлено, что при запросе $bufft = fgets($fp,1); , те при попытке считать только первый символ строки ничего не виснет, но возвращается строка из 0 символов. те полностью пустая.

Посоветуйте, как перед считыванием буфера определить, что он пуст (при попытке считывания он стирается) или как считывать пустой буфер/dev/ttyS1 без последующего зависания?

Лига программистов

2.1K постов11.9K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

1
Автор поста оценил этот комментарий

в fstats() можно посмотреть размер непрочитанных данных

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

if (fstat($fp) != false) {

$bufft = fgets($fp,8);

}

виснет :(

показать ответы
1
DELETED
Автор поста оценил этот комментарий

Я б наоборот сделал if ($fp != NULL) читаем. Если нуль то ессно ничего не делаем или в else метод стопа добавить.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

if ($fp != NULL) {

stream_set_timeout($fp, 0, 150000);

$bufft = stream_get_line($fp,7); // получаем ответ от ардуины

}

не работает. виснет.

0
Автор поста оценил этот комментарий

if ($fp == NULL) тогда код стоп, если нет, то считываем $bufft = fgets($fp,7); ?

Мне кажется это не сработает. $fp никогда не будет равен NULL, потому-что открыть-то порт-устройство (/dev/ttyS1) можно всегда, а вот прочитать из него что-то можно не всегда. и опять повиснет на fgets.

Мне кажется перед fgets надо вызвать stream_set_timeout(), оно прерывает ожидание по истечении заданного времени, а дальше анализируй получил что или нет.

PS. В PHP не силён, просто мимокрокодил.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

stream_set_timeout() не работает. виснет. я пробовал.

показать ответы
2
DELETED
Автор поста оценил этот комментарий

А проблема разве не в том, что он пытается обработать ответ, который null, как string? Есть проверка на null перед обработкой ответа?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Возможно, Вы правы. Очень логичный ответ (ваш) . вот так как-то сделать?  

$filename = "/dev/ttyS1";

$fp = fopen($filename, "w+");


  if ($fp == NULL) тогда код стоп, если нет, то считываем $bufft = fgets($fp,7); ?

показать ответы