Если Вы решили писать все сами, то тогда надо разобраться в програмных тонкостях.
COM порт представляет собой (с програмной точки зрения) 7 смежных адресов ввода-вывода, причем некоторые(в зависимости от установленных бит) играют разную роль. Так смещение 0 — THR/RBR, при DLAB = 0, и DLL при DLAB = 1;
THR — промежуточный регистр передатчика(соответственно при записи),
RBR — буферный регистр принимаемых данных(соответственно при чтении),
DLL — регистр младшего байта делителя частоты.
DLAB — 7 бит регистра со смещением 2(FCR).
Кроме того, необходимо анализировать ошибки, возникающие при передаче/приеме, так если Вы попробуете прочитать из порта, к которому ничего не подключено, или не совпадают частоты передачи данных, то Вы увидите 0xFF, и код ошибки в соответствующем регистре ....
Так что будте очень внимательны, и прочитайте какую нибудь книгу про компьютерное железо, или воспользуйтесь стандартным драйвером, по моему, очень тяжело найти задачу, с COM портом, которую нельзя было бы решить в user-mode