<?php
/*
irp_extxArduino - Example for irp_classes (https://github.com/msillano/irp_classes)
Copyright (c) 2017 Marco Sillano. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
// using 'PHP Serial extension' free: TX/RX to/from Arduino in php
// see arduino/rawRxTx02.ino
function txArduino($raw)
{
$arduinocom = 'COM3'; // TODO: change here if required
if (!ser_isopen())
ser_open($arduinocom, 9600, 8, "None", "1", "None");
//
if (!ser_isopen())
{
echo "<div class=Error>";
echo "ERROR: '.$arduinocom.' not open ";
echo "</div>";
exit;
}
echo '+++ from Serial: ' . ser_version() . '<br>'; // to verify 1000 bytes limits
sleep(2);
$fromarduino = '';
// wait an 'A' from Arduino
do
{
sleep(2);
$fromarduino = ser_read(); // handshake
} while (strpos($fromarduino, 'A') === false);
// echo 'start send <br>';
// then send 'T' + data
ser_write('T'); // command: T
sleep(1);
ser_write($raw); // send data
}
// receive RAW fron Arduino
function rxArduino($protocol=NULL)
{
$arduinocom = 'COM3'; // TODO: change here if required
if (!ser_isopen())
ser_open($arduinocom, 9600, 8, "None", "1", "None");
//
if (!ser_isopen())
{
echo "<div class=Error>";
echo "ERROR: '.$arduinocom.' not open ";
echo "</div>";
exit;
}
echo '+++ from Serial: ' . ser_version() . '<br>';
sleep(2);
$fromarduino = '';
$RXstatus = 0;
// RX finite state Automata
while (true)
{
sleep(2);
switch ($RXstatus)
{
case 0: // waiting 'A'
$fromarduino = ser_read();
// echo 'status 0, rx ='.$fromarduino.'<br>';
if (strpos($fromarduino, 'A') === false)
break;
$RXstatus = 1;
break;
case 1: // sends 'R' command
ser_write('R');
sleep(1);
$fromarduino = ser_read();
// echo 'status 1, rx ='.$fromarduino.'<br>';
$fromarduino = '';
sleep(2);
$RXstatus = 2;
break;
case 2: //collect all data
$fromarduino .= ser_read();
// echo 'status 2, rx ='.$fromarduino.'<br>';
if (strpos($fromarduino, '}') !== false)
{
$RXstatus = 3; // end RAW
break;
}
if (strpos($fromarduino, 'A') !== false)
$RXstatus = 0; // restart
break;
case 3: // done: format RAW and returns
$s = strpos($fromarduino, '={'); // start RAW
$e = strpos($fromarduino, '}'); // end RAW
if ($e > $s)
return trim(substr($fromarduino, $s + 2, $e - $s - 2));
$e = strrpos($fromarduino, '}');
if ($e > $s)
return trim(substr($fromarduino, $s + 2, $e - $s - 2));
$status = 0; // bad data, restart
}
}
}
?>
|