|
다른 방법이 있는지 잘모르겠습니다.
API로 CreateFile해서 문제가 없으면 사용중이지않는것이겠죠?...
아래 샘플 코등 있는데...
int OpenComPort(int nPort) 함수에서 CreatFile 한후
결과값 확인하신 부분만 보시면 될것 같습니다.
//샘플코드...
bool CheckComport( int iSerialNumber)
{
if(OpenPort(iSerialNumber)>0)
{
CloseComPort(iSerialNumber);
return true; //사용할수 있는경우
}
else
return false;//사용할수 없는경우..
}
이상입니다.
//------------------------------------
HANDLE hCommPort;
OVERLAPPED OVL;
HANDLE hEndComPortEvent,hThreadCom;
int iCommPort;
char gszPort[16];
/ Opens the com. port (1 = COM1) and returns its ID value.
// If an error occurs, the return value is negative
int OpenComPort(int nPort)
{
char szPort[10];
int iStatus;
DWORD dwError;
COMMTIMEOUTS CommTimeOuts;
BOOL fSuccess =0;
wsprintf(szPort, "COM%d", nPort);
hCommPort = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL
);
if(hCommPort == INVALID_HANDLE_VALUE) { //Port번호에 문제가 있거나 사용중인경우등..
iStatus = GetLastError();
DisplayOpenError(iStatus);
return -1;
}
if(!hEndComPortEvent) {
//--- 쓰레드의 동기화
hEndComPortEvent = CreateEvent (
NULL, // no security attributes
TRUE, // auto reset event
FALSE, // not signaled
NULL // no name
);
}
if (hEndComPortEvent == NULL) {
MessageBox (NULL, TEXT("Unable CreateEvent Process"),TEXT("Error"), MB_OK);
dwError = GetLastError();
return -2;
}
// setup device buffers
if (!SetupComm(hCommPort, 4096, 4096)) {
MessageBox (NULL, TEXT("Unable SetupComm Function"),TEXT("Error"), MB_OK);
dwError = GetLastError();
return -3;
}
// set up for overlapped non-blocking I/O
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(hCommPort, &CommTimeOuts);
// Make an overlapped structure for i.o.
memset(&OVL,0,sizeof(OVL));
OVL.hEvent = CreateEvent(
NULL, // no security attributes
TRUE, // auto reset event
FALSE, // not signaled
NULL // no name
);
if (OVL.hEvent == NULL) {
MessageBox (NULL, TEXT("Unable OVL.hEvent Function"),TEXT("Error"), MB_OK);
dwError = GetLastError();
return -4;
}
// Set the mask for the events you want to listen for
fSuccess = SetCommMask(hCommPort,EV_RXCHAR | EV_RXFLAG);
if(!fSuccess) {
MessageBox (NULL, TEXT("Unable SetCommMask Function"),TEXT("Error"), MB_OK);
dwError = GetLastError();
return -5;
}
return 1;
}
// Closes the comm. port specified by nPortID
// returns TRUE if success, FALSE if failure
BOOL CloseComPort(int nPortID)
{
if (nPortID < 0)
return FALSE;
if(hCommPort != INVALID_HANDLE_VALUE) {
CloseHandle(hCommPort);
hCommPort = INVALID_HANDLE_VALUE;
}
FlushBuffers(nPortID);
if(hEndComPortEvent)
CloseHandle(hEndComPortEvent);
hEndComPortEvent=0;
if(OVL.hEvent)
CloseHandle(OVL.hEvent);
OVL.hEvent = NULL;
return TRUE;
}
김성준 님이 쓰신 글 :
: Cport로 통신 프로그램을 하나 만들었습니다.
:
: Com1을 통해 통신을 주고받는데 다른 프로그램에서 Com1을 사용중일 경우
:
: 이를 검사해서 메세지를 띄우려고 합니다.
:
: 어떤 방법을 써야 할까요?
:
: 읽어주셔서 감사합니다.
|