php чтение с COM порта

Feika
Offline
Зарегистрирован: 29.03.2013

при контекте на ком порт выдает

 screen /dev/ttyUSB0

Temp=36C

пытаюсь это самое вытянуть через пхп и не как :( помогите господа...

 

 

<?php
include "php_serial.class.php";
 
// Let's start the class
$serial = new phpSerial();
// First we must specify the device. This works on both linux and windows (if
// your linux serial device is /dev/ttyS0 for COM1, etc)
$serial->deviceSet("/dev/ttyUSB0");
 
// Set for 9600-8-N-1 (no flow control)
$serial->confBaudRate(9600); //Baud rate: 9600
$serial->confParity("none");  //Parity (this is the "N" in "8-N-1")
$serial->confCharacterLength(8); //Character length     (this is the "8" in "8-N-1")
$serial->confStopBits(1);  //Stop bits (this is the "1" in "8-N-1")
$serial->confFlowControl("none");
 
// Then we need to open it
$serial->deviceOpen();
 
// Read data
$read = $serial->readPort();
 
// Print out the data
echo $read;
echo "asd";
 
// If you want to change the configuration, the device must be closed
$serial->deviceClose();
?>
 
 
в логах апача пусто ... права на /dev/ttyUSB0 на апачь с 777
tsostik
Offline
Зарегистрирован: 28.02.2013

Для начала тупой вопрос - а если без апача, а просто запустить php из терминала?

Вопрос 2 - а $serial->readPort() стоит и ждет, пока чтонибудь придет в порт или при отсуствии данных возвращает пустую строку?

Если второе, то проблема, скорее всего, в том, что пишете в порт и читаете в разное время.

Feika
Offline
Зарегистрирован: 29.03.2013

я не програмист я тока учюсь :) может и проблемма в коде если слушать порт то он кидает в него раз в 2 секунды может поставить по быстрее ?

tsostik
Offline
Зарегистрирован: 28.02.2013

Я изрядно подзабыл синтаксиси пэхапе, но если так попробовать?

 // Read data
$read = "";
while( ($read == ""){
    $read = $serial->readPort();
};

 

Feika
Offline
Зарегистрирован: 29.03.2013

 

попробывал когда как бывает что напишет Те а бывает и Темп челиком может будет разумние сделать не слешать ком порт а сделать запрос на ардуино ?

tsostik
Offline
Зарегистрирован: 28.02.2013

Вы, конечно, не обижайтесь, но орфографию и пунктуацию придумали для того, чтобы написанный текст мог прочитать хоть кто-нибудь кроме автора.

Я так и не справился понять предыдущий комент, но насколько я понял проблему, она состоит в том, что ардуино посылает данные, а php соответственно, читает без какой либо синхронизации, как повезет. Вот и не совпадают, естественно.

Решения у проблемы минимум два.

1)Ардуино с какой-то периодичностью шлет информацию не забывая в начале пакета данных писать что-то типа "внимание, данные", а по окончанию написать "я - все!". Php, соответственно при чтении дожидается признака начала данных, записвывает пришедшее до тех пор, пока не появится признак конца данных.

2)php посылает ардуине команду "а пришли ка мне данные", ардуина в ответ отсылает данные, не забывая отослать признак конца передачи.

Какой способ выбрать - зависит от специфики задачи.

Feika
Offline
Зарегистрирован: 29.03.2013

 

Спасибо большое, буду рыть в сторону 2го метода, хотя передачу данных на ардуине мы еще не проходили но направление вы мне указали верное, если будет свежие мысли пишите...
 
tsostik
Offline
Зарегистрирован: 28.02.2013

В общеи-то все достаточно просто должно быть. Могут быть тонкости непосредственно в реализации, но не существенные.

Общая последовательность примерно такая:

1)php пишет в сериал команду, которая говорит ардуине, что от нее ждут данных. Видимо, это должно быть что-то типа

$serial->writePort('1');

После чего начинает ждать данные. Неглупо проверять время ожидания, чтобы отваливаться, если, например ардуина повисла/отключилась или порт отвалился.

2)Ардуино в основном цикле периодически проверяет состояние Serial и если там есть данные, отсылает ответ, завершая его символом конца данных, например '\n'. Схематично это будет так:

void loop()
{
   ... //тут что-то делаем
    if(Serial.available()){
        //если пришел запрос читаем его и определяем что от нас хотят
        switch (data_from_serial) 
        {
            case '1': SendTemperature(); break;
            case '2': SendHumidity(); break;
            case '3': SendLightLevel(); break
        }
    }
    ...//а тут продолжаем что-то делать
}

3)php читает данные, пока не встретит символ '\n' Что-то типа

$answer = "";
$dataready = 0;
do {
    $data = "";
    while ($data == "") $data = $serial->readPort();
    if ($data == '\n') 
    {
        $dataready = 1;
    } else 
    {
        $answer .= $data;
    }
} while($dataready == 0);

Понятно, что это все наброски  "на глаз"

Feika
Offline
Зарегистрирован: 29.03.2013

спасибо большое.

krasnov
Offline
Зарегистрирован: 18.03.2014

Добрый день!

Столкнулся с такой же проблемой.

.. skipped ..

while(1) {
  echo date("H:i:s").PHP_EOL;
  $data = $serial->readPort();
  if ($data<>"") {
    echo $data.PHP_EOL;
  }
  sleep(1);
}

Один и тот же файл на двух машинах. В ls /dev/tty* смотрел, один и тот же порт /dev/ttyACM0. Права посмотрел, совпадают. 

На Ubuntu 12.04 читает, в if заходит, а на Ubuntu Server 12.04 нет.

Куда еще можно копнуть?