BOOL CSuperSerialCard::CheckComm() { m_dwCommInactivity = 0; if ((m_hCommHandle == -1) && m_dwSerialPort) { TCHAR portname[12]; // we have /dev/ttyS0..X instead of COM1..COMX+1? if(m_dwSerialPort < 0 || m_dwSerialPort > 99) m_dwSerialPort = 1;//buffer overflow check sprintf(portname, TEXT("/dev/ttyS%u"), (unsigned int)(m_dwSerialPort - 1)); /* m_hCommHandle = CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access (LPSECURITY_ATTRIBUTES)NULL, // default security attributes OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // required for WaitCommEvent() NULL);*/ m_hCommHandle = open(portname, O_RDWR | O_NOCTTY | O_NDELAY); if (m_hCommHandle != -1) { UpdateCommState(); /* COMMTIMEOUTS ct; ZeroMemory(&ct,sizeof(COMMTIMEOUTS)); ct.ReadIntervalTimeout = MAXDWORD; SetCommTimeouts(m_hCommHandle,&ct);*/ CommThInit(); } else { ;//DWORD uError = 1;//GetLastError(); } } return (m_hCommHandle != -1); }
BOOL CSuperSerialCard::CheckComm() { m_dwCommInactivity = 0; // check for COM or TCP socket handle, and setup if invalid if (IsActive()) return true; if (m_dwSerialPortItem == m_uTCPChoiceItemIdx) { // init Winsock 1.1 (for Win95, otherwise could use 2.2) WSADATA wsaData; if (WSAStartup(MAKEWORD(1, 1), &wsaData) == 0) // or (2, 2) for Winsock 2.2 { if (wsaData.wVersion != 0x0101) // or 0x0202 for Winsock 2.2 { WSACleanup(); return FALSE; } // initialized, so try to create a socket m_hCommListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_hCommListenSocket == INVALID_SOCKET) { WSACleanup(); return FALSE; } // have socket so attempt to bind it SOCKADDR_IN saAddress; saAddress.sin_family = AF_INET; saAddress.sin_port = htons(TCP_SERIAL_PORT); // TODO: get from registry / GUI saAddress.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(m_hCommListenSocket, (LPSOCKADDR)&saAddress, sizeof(saAddress)) == SOCKET_ERROR) { m_hCommListenSocket = INVALID_SOCKET; WSACleanup(); return FALSE; } // bound, so listen if (listen(m_hCommListenSocket, 1) == SOCKET_ERROR) { m_hCommListenSocket = INVALID_SOCKET; WSACleanup(); return FALSE; } // now send async events to our app's message handler if (WSAAsyncSelect( /* SOCKET s */ m_hCommListenSocket, /* HWND hWnd */ g_hFrameWindow, /* unsigned int wMsg */ WM_USER_TCP_SERIAL, /* long lEvent */ (FD_ACCEPT | FD_CONNECT | FD_READ | FD_CLOSE)) != 0) { m_hCommListenSocket = INVALID_SOCKET; WSACleanup(); return FALSE; } } } else if (m_dwSerialPortItem) { _ASSERT(m_dwSerialPortItem < m_vecSerialPortsItems.size()-1); // size()-1 is TCP item TCHAR portname[SIZEOF_SERIALCHOICE_ITEM]; wsprintf(portname, TEXT("COM%u"), m_vecSerialPortsItems[m_dwSerialPortItem]); m_hCommHandle = CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access (LPSECURITY_ATTRIBUTES)NULL, // default security attributes OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // required for WaitCommEvent() NULL); if (m_hCommHandle != INVALID_HANDLE_VALUE) { //BOOL bRes = SetupComm(m_hCommHandle, 8192, 8192); //_ASSERT(bRes); UpdateCommState(); // ReadIntervalTimeout=MAXDWORD; ReadTotalTimeoutConstant=ReadTotalTimeoutMultiplier=0: // Read operation is to return immediately with the bytes that have already been received, // even if no bytes have been received. COMMTIMEOUTS ct; ZeroMemory(&ct,sizeof(COMMTIMEOUTS)); ct.ReadIntervalTimeout = MAXDWORD; SetCommTimeouts(m_hCommHandle,&ct); CommThInit(); } else { DWORD uError = GetLastError(); } } return IsActive(); }