Начни с того, что _ручками_ заполни _все_ поля DCB, и посмотри правильно ли отработала SetCommState. Далее, распространенная ошибка — если используешь OVERLAPPED, то не нужно использовать эту структуру для вызова функции, пока не получен окончательный (асинхронный) результат предыдущего вызова. А вообще я много раз сталкивался с RS-232 и каждый раз узнаю новую фичу :)