Serial communication is done differently on different architectures and machines so the way that serial communication is done should be delegated to the architecture.
A design I thought of is similar to the Allocator interface in that we have a Serial struct that contains write and read functions and is populated and initialised by the architecture.