php чтение с COM порта
- Войдите на сайт для отправки комментариев
Втр, 09/04/2013 - 21:18
при контекте на ком порт выдает
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
Для начала тупой вопрос - а если без апача, а просто запустить php из терминала?
Вопрос 2 - а $serial->readPort() стоит и ждет, пока чтонибудь придет в порт или при отсуствии данных возвращает пустую строку?
Если второе, то проблема, скорее всего, в том, что пишете в порт и читаете в разное время.
я не програмист я тока учюсь :) может и проблемма в коде если слушать порт то он кидает в него раз в 2 секунды может поставить по быстрее ?
Я изрядно подзабыл синтаксиси пэхапе, но если так попробовать?
// Read data $read = ""; while( ($read == ""){ $read = $serial->readPort(); };попробывал когда как бывает что напишет Те а бывает и Темп челиком может будет разумние сделать не слешать ком порт а сделать запрос на ардуино ?
Вы, конечно, не обижайтесь, но орфографию и пунктуацию придумали для того, чтобы написанный текст мог прочитать хоть кто-нибудь кроме автора.
Я так и не справился понять предыдущий комент, но насколько я понял проблему, она состоит в том, что ардуино посылает данные, а php соответственно, читает без какой либо синхронизации, как повезет. Вот и не совпадают, естественно.
Решения у проблемы минимум два.
1)Ардуино с какой-то периодичностью шлет информацию не забывая в начале пакета данных писать что-то типа "внимание, данные", а по окончанию написать "я - все!". Php, соответственно при чтении дожидается признака начала данных, записвывает пришедшее до тех пор, пока не появится признак конца данных.
2)php посылает ардуине команду "а пришли ка мне данные", ардуина в ответ отсылает данные, не забывая отослать признак конца передачи.
Какой способ выбрать - зависит от специфики задачи.
В общеи-то все достаточно просто должно быть. Могут быть тонкости непосредственно в реализации, но не существенные.
Общая последовательность примерно такая:
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);Понятно, что это все наброски "на глаз"
спасибо большое.
Добрый день!
Столкнулся с такой же проблемой.
.. 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 нет.
Куда еще можно копнуть?