Дык, немного там всего. ХОтя... а что ты имеешь ввиду? На уровне железа? - тут лучше справочник по 51 чипу посмотреть. Если на уровне драйвера - то.... ДДК.
Ну и если смотреть по теме - "WinAPI & Visual C++" то тогда вот (на уровне API):
1. Тебе надо знать с каким именно портом ты хочешь работать - COM1, COM2 и тд
можно обращаться к до 255 портам. По виндой (с++) определены константы только для первых 9ти - от COM1 до COM9. Поэтому если хочешь работать с "любым" номером, то лучше использовать записть для драйверов - типа \\.\COM124
2. В API есть набор функций для работы с СОМ-портом - (каждую можно подробно посмотреть в MSDN). Как правило каждая из этих ф-ций получает в качестве параметра хэндл возвращаемый ф-цей (тут ты совершенно прав!) CreateFile
char CommPort[10];
sprintf(CommPort,"\\\\.\\COM%d",nPortNr);
hPort = CreateFile( CommPort,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
3. Обычно необходимо устанавливать параметры порта - это достигается с помощью ф-ций GetCommState и SetCommState. В качестве параметра в них передаётся структура DCB
DCB dcb;
if(GetCommState(hPort, &dcb)==0)
{
CloseHandle(hPort);
// ошибка !
}
4. Порт поддерживает различные протоколы (зависит от протокола устройства подключенного к порту) - протокол определяется набором и значением полей структуры DCB. Например тн "Software"
dcb.fOutX = 1;
dcb.fInX = 1;
dcb.fTXContinueOnXoff = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 0;
dcb.fOutxDsrFlow = 0;
dcb.fOutxCtsFlow = 0;
dcb.XoffChar = 0x13;
dcb.XonChar = 0x19;
SetCommState(hPort,&dcb);
5. Ну и запись/ чтение осуществляется стандартными ф-ми для файлов:
WriteFile(hPort, pBuffer, nHasRead, &dwBytesWritten, NULL);
ReadFile(hPort, pValue, 1024, &dwHasRead, NULL);
Ну и напоследок - самый лучший учебник - пример работы с COM портом - пример из MSDN, в котором есть практически всё, что надо.