PacketIO is a C++ library for framing packets sent or received over an Arduino Stream, such as Serial. It is distributed as a PlatformIO library.

The key feature of this library over other framing implementations, such as PacketSerial, it that it operates on streams. This means that if your application layer is able to produce or consume streams, you can push these streams right the way through your program. Put simply, this means you can send arbitrarily large packets, without having to worry about allocating buffers.

The example below shows a contrived case when streams are needed - it duplicates whatever packets come in, but it works no matter how large the incoming packet is:

#include <Arduino.h>
#include <cobs/Stream.h>
#include <cobs/Print.h>
using namespace packetio;

COBSPrint cobs_out(Serial);
COBSStream cobs_in(Serial);

void setup() {

void loop() {
    // send a packet
    cobs_out.print("Starting packet duplicator");

    // duplicate bytes of every packet read
    while(true) {
        int c =;
        if(c == COBSStream::EOP) {
            // incoming packet ended - end ours too
        else if(c != COBSStream::EOF) {
            // got a byte - duplicate it