# Serial port support for ReactPHP > [!NOTE] > Only Linux is supported for now. Feel free to contribute support for additional platforms. ## Installing ```bash $ 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. ```php $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 `line`s emitted since the last `prompt`. ```php $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"); }); ```