2025-03-20 22:40:01 +01:00
2025-03-20 22:40:01 +01:00
2025-03-20 22:40:01 +01:00
2025-03-20 22:40:01 +01:00

Serial port support for ReactPHP

Note

Only Linux is supported for now. Feel free to contribute support for additional platforms.

Installing

$ composer require noccylabs/react-serial:@dev

Using

The SerialFactory is really a SerialStreamFactory. Its open() method returns a promise that will resolve with a duplex stream for the port.

$serial = new SerialFactory();
$serial->open("/dev/ttyUSB0", 115200)
    ->then(...);

You may find that you need line buffering, in which case you should wrap the stream in a LineBufferedDuplexStream. The wrapped stream will emit the same data and close events as the original stream, but it will also emit a line event once a full line has been received. If you give it a $promptPattern in the constructor it will also emit a prompt event whenever a matching prompt is detected, and with $bufferOutput you will also get an output event with all the lines emitted since the last prompt.

$serial->open("/dev/ttyUSB0", 115200)
    ->then(function (DuplexStreamInterface $stream) {
        // Wrap our stream and use '#> ' as the prompt pattern.
        $shell = new LineBufferedDuplexStream($stream, promptPattern: '/\#\> /', bufferOutput:true);
        // Prepare the commands to execute, in order
        $commands = [
            'set first="value"',
            'set second="something"',
            'apply',
        ];
        // Execute the next command once we get a prompt
        $shell->on("prompt", function () use ($shell, &$commands) {
            $command = array_shift($commands);
            if (!$command) {
                // Closing the wrapper closes the stream
                $shell->close();
                return;
            }
            echo "# \e[1m".$command."\e[0m\n";
            $shell->write($command."\n");
        });
        // Receives each complete line
        $shell->on("line", function ($line) {
            // ...
        });
        // Receives all the output lines from the last command.
        $shell->on("output", function(array $lines) {
            // ...
        });
        // write "config" to our fictive device to enable config mode
        $shell->write("config\n");
    });
Description
Access serial ports in ReactPHP applications
Readme GPL-2.0 38 KiB
Languages
PHP 100%