Hola:
No sé si es la única forma, pero cuando tuve que programar un puerto desde linux, usé la funcion mmap().
Esta función "mapea" un trozo de memoria sobre un puerto físico (o un fichero o cualquier otra cosa del estilo) y te devuelve un puntero a ese puerto fisico (fichero o lo que sea).
Si el punetero devuelto es p, con *p puedes leer y escribir en el puerto.
Siento no poder darte los detalles, pero hace mucho que lo hice y no recuerdo como eran exactamente los parámetros de mmap().
Otra función que quizás te sirva es ioctl(). Sirve para controlar "ficheros" de entrada salida como puertos serie y demás. Junto con ella, a un nivel más "alto" va fcntl(). De todas formas, para usarlas primero debes obtener un descriptor de fichero asociado al puerto.
Se bueno.