Если работаете под WinXP в прямом доступе к портам нет необходимости.
Тем более, что виндузный драйвер все это делает прекрасно - вопрос только в освоении его управлением
и своей прикладной "навеске".
Вырезка из утилиты которую я пользую (дежурный прием пакетов, отсечка пакетов - по таймаутам драйвера и/или по кол-ву принятых байт)
Там поминаются функции Win32API.
Дуплекс реализуется как выделение, например, приема в отдельный поток выполнения и сихнронизацией по семафору с управляющим потоком.
Консольная main()
Код
HANDLE hport;
DCB dcb1;
main()
{
. . . .
hport = CreateFile( s_port, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hport == INVALID_HANDLE_VALUE) printf( "\nCOM_R hport WAS NOT OPEN !\n" );
. . . .
// --- DCB init ----
dcb1.BaudRate= CBR_9600;
dcb1.ByteSize=8;
. . . .
. . . .
succ=SetCommState(hport,&dcb1);
// ------------------------------
COMMTIMEOUTS CommTimeOutsW;
GetCommTimeouts(hport, &CommTimeOutsW);
. . . .
CommTimeOutsW.ReadIntervalTimeout = t_RITT;
CommTimeOutsW.ReadTotalTimeoutMultiplier = t_RTTM;
CommTimeOutsW.ReadTotalTimeoutConstant = t_RTTC;
// ----
SetCommTimeouts(hport, &CommTimeOutsW);
succ=SetCommState(hport,&dcb1);
. . . .
PurgeComm(hport, PURGE_TXCLEAR | PURGE_RXCLEAR );
EscapeCommFunction(hport, SETRTS);
EscapeCommFunction(hport, SETDTR);
. . . . .
while( !kbhit() )
{ real_read = 0x00;
ReadFile(hport,&RxR_bf[0],50,&real_read,NULL);
if(real_read > 0)
{
} // if read > 0
else
{
printf("*");
}
real_write = 0x00;
} // while
PurgeComm(hport, PURGE_TXCLEAR | PURGE_RXCLEAR );
CloseHandle(hport);
return 0;
}