…or rather, control anything through serial port with PHP.
This guide will be soon updated to a full-fledged serial console made in PHP (show output from device, but also send commands).
I must say, credit goes to this github repository which in turn is based on another known repository, and which I heavily simplified and stripped down because I don’t like having to deal with PHP classes and everything that has to do with it.
Let’s cut down the overhead, and to the chase.
This is an example code:
function serialread() {
global $sim800;
$chars = [];
do {
$char = fread($sim800, 1);
$chars[] = $char;
} while ($char != "\n" && $char != "");
return join('', $chars);
}
exec("stty -F $tty cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts");
$sim800=fopen($tty,"w+b");
stream_set_blocking($sim800, false);
fwrite($sim800,"AT\r");
fwrite($sim800,"AT+DDET=1\r");
fwrite($sim800,"AT+CLIP=1\r");
fwrite($sim800,"ATS0=2\r");
fwrite($sim800,"AT+CMGF=1\r");
sleep(1);
while (true) {
$data = trim(serialread());
if (strlen($data)>1) {
echo $data."\n";
}
sleep(1);
}
And now let’s do some explaining.
$tty
is the string containing the value of the serial device file, in my case I defined it as $tty="/dev/ttyUSB0";
because I prefer using an external adapter and keeping more juicy GPIO pins to myself.
The $sim800=fopen($tty,"w+b");
instruction opens the serial stream as a writeable and readable file, and resets its content to empty, the b
in "w+b"
forces the connection to be established in binary format.
The stream_set_blocking($sim800, false);
instruction allows the fread()
command to immediately return a result, even if null
, after calling it, instead of waiting for something to be output to the serial console.
The fwrite()
instructions are to initialize the SIM800 module as I like it, you may want to search on the official AT commands of the SIM800 to find their meaning. What’s to be learnt here, is that, after you issue a command string, you want to end it with "\r"
which is a carriage return, and sends the Enter key to the console; using "\n"
which instead is a newline would not work to issue commands.
I use trim()
on the serialread()
function (which by the way is stolen from the repository linked above) because the SIM800 likes to add a lot of new lines around, and to parse and/or display the serial ouput of the module it’s better if you have a bare string to process.
That’s all folks.