PHP и com-порт: Как не закрывать соединение? Или, все таки JAVA?

Footniko

Постоялец
Регистрация
2 Ноя 2011
Сообщения
57
Реакции
4
Всем доброго времени суток, господа!
Вот уже как второй день пытаюсь обойти эту проблему. В общем, пишу php скрипт, который должен подключатся к COM-порту и отсылать/принимать с него данные(все действие происходит в AJAX режиме). Проблема заключается в том, что нужно постоянно, что бы было открыто соединение с портом, а у меня оно автоматически закрывается после отрабатывания скрипта. Как сделать так, что бы соединение было открыто до тех пор, пока не будет нажата какая то кнопка на странице. Пробую примерно так:
PHP:
exec("mode com3: BAUD=9600 PARITY=N data=8 stop=1 xon=off");
$port = fopen('COM3', 'w');
sleep(2);
fwrite($port, (string)$_POST["lampValue"]);
//sleep(5);
То есть, на главной странице мы жмем кнопки. В зависимости от нажатой кнопки, в $_POST["lampValue"] попадает соответствующее значение.
У меня работает так:
После нажатия кнопки, открывается соединение, ждем 2 секунды, загорается лампочка и сразу тухнет, потому что закрывается соединение.
Должно работать так:
После нажатия кнопки, открывается соединение, ждем 2 секунды, загорается лампочка и горит до тех пор, пока не будет нажата соответствующая кнопка на странице. Только тогда она тухнет и разрывается соединение. В то время как лампочка горит(соединение включено), мы можем отсылать/принимать какие то данные с нашего порта.
К чему веду:
Планирую через web-интерфейс управлять машинкой, подключенной через com-порт. На сколько это реально и удобно с PHP? Слышал, что на JAVA можно писать web-сайты. Появится ли у меня там возможность реализовать эту идею? Повторюсь, обязательно нужно через web-интерфейс. PHP я уже хоть какой то опыт имею, JAV'у в глаза не видел. Какие ваши мысли по этому поводу? Спасибо.
 
Демоны... мне кажется это слишком глубоко... Да и мне нужно влиять на процесс, который выполняется(в моем случае это открытое соединение с com-портом(просто while(true) не прокатит)). Не могли бы вы пример маленький привести, а то мне кажется мне оно не подойдет. Горы информации, а того, что мне нужно, не нашел.
По сути, все что мне нужно - это что бы php не закрывал соединение с com-портом до тех пор, пока я ему не скажу. Или даже так: когда я открыл страницу - скрипт соединился с портом. Закрыл страницу - отсоединился...
Возможно такое с php или это проблематично?
Спасибо.
 
Я думаю, что все дело в том, что при завершении работы скрипта удаляются все переменные и закрываются все соединения, а рабочему скрипту передать новые данные невозможно... Отсюда делаем вывод, что нужно делать 2 скрипта на рнр: 1. постоянно запущен и в цикле читает какой либо файл, в который записываем команды (например 1- включить лампочку, 0- выключить лампочку) 2. Скрипт который доступен с браузера и принимает команды пользователя и записывает в файл.
 
Я думаю, что все дело в том, что при завершении работы скрипта удаляются все переменные и закрываются все соединения, а рабочему скрипту передать новые данные невозможно... Отсюда делаем вывод, что нужно делать 2 скрипта на рнр: 1. постоянно запущен и в цикле читает какой либо файл, в который записываем команды (например 1- включить лампочку, 0- выключить лампочку) 2. Скрипт который доступен с браузера и принимает команды пользователя и записывает в файл.
Так что ли?
PHP:
while(true) {
    include('lamp.php');
    echo $value;
    if($value == 3)
        break;
}
Так не пойдет. Нельзя менять параметры динамически...( (Напомню, что параметры приходят в файл lamp.php через ajax).
 
PHP:
while(true){
$filename = "flag.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, 1);
fclose($handle);
if($contents==0){close_port()}
if($contents==1){open_port()}
sleep(5);
}
ну а в lamp.php делаем запись в файл flag.txt в зависимости от пришедшего события.
 
Сделал так:
PHP:
$port  = fopen('file.txt', 'r');
$port2 = fopen('COM3', 'w');
sleep(2);
 
while($port2) {
    $contents = fread($port, 1);
    if($contents == 3)
        break;
    fwrite($port2, $contents);
}
fclose($port);

Но все равно не пашет. Не влияет оно на скрипт во время его исполнения(while(true)), хотя в файл все записывается...
Еще раз повторюсь. Вся проблема в том, что закрывается соединение с com-портом после отрабатывания скрипта. Если бы не это, я бы ввобще тему не поднимал. Есть ли какой нибудь способ изменить это, возможно в настройках php? Или, может, все таки на java пробовать?
 
Повторяю еще раз... Один файл должен крутиться в ВЕЧНОМ цикле, по той простой причине, что как полько он выйдет из цикла порт закроется!!! А вот с помощью второго скрипта через файл нужно управлять первым. Может хоть так дойдет... При закрытии программы (не важно на чем она написана) все ее переменные УНИЧТОЖАЮТСЯ.
 
Для просмотра ссылки Войди или Зарегистрируйся
Спасибо! Вроде получилось:
index.php:
PHP:
$port2 = fopen('COM3', 'w');
sleep(2);
 
while(true) {
    $port  = fopen('file.txt', 'r');
    $contents = fread($port, 1);
    if($contents == 3)
        break;
    if($contents == 1)   
        fwrite($port2, '1');
    if($contents == 0)   
        fwrite($port2, '0');   
}
fclose($port);
fclose($port2);

lamp.php:
PHP:
$file = fopen('file.txt', 'w');
fwrite($file, $_POST["lampValue"]);
 
fclose($port);

Только, правда, почему то, красная лампочка загорается на платке при запуске этого скрипта, как будто в нее постоянно какие то параметры записываются... Ну, ладно, ерунда, разберусь с этим.
Это только лампочка, а что будет, когда нужно будет управлять моторчиками...)
Хотя, как по мне - это самый важный шаг, а то я уже думал что на пхп этого не реализовать...

Только, правда, почему то, красная лампочка загорается на платке при запуске этого скрипта, как будто в нее постоянно какие то параметры записываются...
А, теперь понятно, я же сам в цикле это и делаю)
Так будет правильнее:
PHP:
$port2 = fopen('COM3', 'w');
sleep(2);
 
while(true) {
    $port  = fopen('file.txt', 'r');
    $contents = fread($port, 1);
    if($contents == 3)
        break;
    if($contents == 1)    {
        if(isset($mem) && $mem == 1)
            continue;
        else    {   
            $mem = 1;
            fwrite($port2, '1');
        }   
    }   
    if($contents == 0)    {
        if(isset($mem) && $mem == 0)
            continue;
        else    {   
            $mem = 0;
            fwrite($port2, '0');
        }   
    }   
}
fclose($port);
fclose($port2);
 
Здравствуйте.)))))Можно здесь уточнить некоторые моменты?
Я попыталась реализовать, почти так же, как здесь написано, только вместо лампочки я решила использовать принтер, т.е я пыталась включать и выключать его, но он не реагировал на мои команды. Вначале я создала кнопки и в скрипте для кнопки «включить» я присвоила переменной lampValue значение «1», а для кнопки «выключить» lampValue="0".
т.е у меня вышло 2 скрипта для кнопок:
vkl.php:
PHP:
<?php
function pressAnyKey() {
    $lampValue="1";
}
?>

vikl.php:
PHP:
<?php
function pressSomeKey() {
    $lampValue="0";
}
?>

Затем я вставила два скрипта index.php и lamp.php в html файл, содержимые скриптов такое же как описывалось в этой теме.
В общем у меня получилось:
HTML:
<p align="center"><p align="right"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>   
<!--#include virtual="vkl.php" -->
<!--#include virtual="vikl.php" -->
<!--#include virtual="lamp.php" -->
<!--#include virtual="index.php" -->
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />   
<meta name="author" content="" />    <title>Untitled 3</title> 
<link href="css/main.css" rel="stylesheet" type="text/css"/></head>
<body><div id="page_align" class="b3radius">
  <div id="header">
<div id="header_nav"><ul><li><a href="a">Главная</a></li>
<li><a href="a">Климат-контроль</a></li>
<li><a href="a">Кормление</a></li>
</ul>
<div id="content" class="f_right">
<div id="c_right f_right">
<input type="button" value="Вкл" name="button" class="push_but" onclick="pressAnyKey()" />
<input type="button" value="Выкл" name="btn" class="push_btn" onclick="pressSomeKey()" />
</div>
</div>
</div>
<div id="sidebar"></div><div id="content">Сайт.</div>
<div class="clr"></div></div></body></html></p></p>
Только вот прога почему-то не пашет(((((
Может дело в кнопках, может я им не ту переменную присвоила?))))Буду очень признательна за ответ))))))
 
Назад
Сверху