Обычно порт открывается как обычный файл. Как только порт открыт, то в него можно записывать и считывать как из обычного файла. Конечно же прийдётся добавить различные проверки байтов при чтении и записи. CComPort::CComPort(CString& sComPort) { m_sComPort = sComPort; m_bPortReady = FALSE; } // конец конструктора CComPort
CComPort::~CComPort() {
} // конец деструктора CComPort
// // инициализация COM порта // BOOL CComPort::Initialize() { DWORDdwRC; DWORDdwError; charsMsg[512];
m_bPortReady = TRUE; // всё OK
m_hCom = CreateFile(m_sComPort, GENERIC_READ | GENERIC_WRITE, 0, // экслюзивно занимаем порт NULL, // no security OPEN_EXISTING, 0, // no overlapped I/O NULL); // null template
if (m_hCom == INVALID_HANDLE_VALUE) { m_bPortReady = FALSE; dwError = GetLastError();
// обработка ошибки LPVOID lpMsgBuf; lpMsgBuf = NULL; dwRC = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, // из GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // (LPTSTR) &lpMsgBuf, 0, NULL);
if (dwRC && lpMsgBuf) { sprintf(sMsg, "COM open failed: Port=%s Error=%d - %s", m_sComPort, dwError, lpMsgBuf); AfxMessageBox(sMsg); } else { sprintf(sMsg, "COM open failed: Port=%s Error=%d ", m_sComPort, dwError); AfxMessageBox(sMsg); } // end if if (dwRC && lpMsgBuf) { LocalFree( lpMsgBuf ); } // end if } // end if
if (m_bPortReady) { m_bPortReady = SetupComm(m_hCom, 128, 128); // размер буфера if (!m_bPortReady) { dwError = GetLastError(); sprintf(sMsg, "SetupComm failed: Port=%s Error=%d", m_sComPort, dwError); AfxMessageBox(sMsg);
} // end if } // end if
if (m_bPortReady) { m_bPortReady = GetCommState(m_hCom, &m_dcb); if (!m_bPortReady) { dwError = GetLastError(); sprintf(sMsg, "GetCommState failed: Port=%s Error=%d", m_sComPort, dwError); AfxMessageBox(sMsg); } // end if } // end if
if (m_bPortReady) { m_dcb.BaudRate = 9600; m_dcb.ByteSize = 8; m_dcb.Parity = NOPARITY; m_dcb.StopBits = ONESTOPBIT; m_dcb.fAbortOnError = TRUE;
m_bPortReady = SetCommState(m_hCom, &m_dcb); if (!m_bPortReady) { dwError = GetLastError(); sprintf(sMsg, "SetCommState failed: Port=%s Error = %d", m_sComPort, dwError); AfxMessageBox(sMsg); } } // end if
if (m_bPortReady) { m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts); if (!m_bPortReady) { dwError = GetLastError(); sprintf(sMsg, "GetCommTimeouts failed: Port=%s Error = %d", m_sComPort, dwError); AfxMessageBox(sMsg); } // end if } // end if
if (m_bPortReady) { m_CommTimeouts.ReadIntervalTimeout = 50; m_CommTimeouts.ReadTotalTimeoutConstant = 50; m_CommTimeouts.ReadTotalTimeoutMultiplier = 10; m_CommTimeouts.WriteTotalTimeoutConstant = 50; m_CommTimeouts.WriteTotalTimeoutMultiplier = 10; m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts); if (!m_bPortReady) { dwError = GetLastError(); sprintf(sMsg, "SetCommTimeouts failed: Port=%s Error = %d", m_sComPort, dwError); AfxMessageBox(sMsg); } // end if } // end if
return m_bPortReady; } // end CComPort::Initialize
// // освобождаем COM порт // void CComPort::Terminate() { CloseHandle(m_hCom); } |