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.2K поста12K подписчик

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

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

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

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

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); ?

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества