La libreria l'avrei basata su boost.asio.
Come sistemi operativi mi limitavo almeno a linux Mac e windows.
Nell'esempio l'approccio di utilizzo non mi sembrava per niente complicato, faccio un esempio su come vorrei che si utilizzasse:
SerialX s1( "/dev/ttyS0", Baudrate( 115200 ) );
// configurazione
s1.option( CharSize( 8 ) );
s1.option( FlowControl( FlowControl::NONE ) );
s1.option( Parity( Parity::NONE ) );
// lettura e scrittura sono asincroni e restituiscono dei future. Uso boost::future in quanto
// come PPL permetton la continuazione.
// Caso1: scrittura
std::vector< int > b= {1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto res = sp1.send( begin( b ), end( b ) );
// esegui altra roba in parallelo
doOtherTask();
// aspetta che i dati siano stati inviati
cout << "spediti " << res.get() << " bytes" << endl;
// Caso2: scrittura con continuazione
sp1.send( begin( b ), end( b ) ).then( [ &sp1, &b, &cout ] ( boost::future< int > f
{
// aspetta che i dati siano stati inviati
cout << "spediti " << f.get() << " bytes" << endl;
});
// stessa cosa per la lettura. La lettura dovrebbe restiuire un future con il Buffer letto
auto res3 = sp1.read();
auto read = res3.get();
// ...
L'utilizzo del C++11 (almeno per quanto riguarda l'implementazione) vorebbe essere solo come strumento di semplificazione.