레이블이 serial port인 게시물을 표시합니다. 모든 게시물 표시
레이블이 serial port인 게시물을 표시합니다. 모든 게시물 표시

6/07/2013

serial port cts rts checking signal cable. linux and win32



// win32

int IsCTSEnabled(int handle)
{
  int status;

  GetCommModemStatus(handle, (LPDWORD)((void *)&status));

  if(status&MS_CTS_ON) return(1);
  else return(0);
}

// linux.

// ref
/*
TIOCM_LE  DSR (data set ready/line enable)
TIOCM_DTR DTR (data terminal ready)
TIOCM_RTS RTS (request to send)
TIOCM_ST  Secondary TXD (transmit)
TIOCM_SR  Secondary RXD (receive)
TIOCM_CTS CTS (clear to send)
TIOCM_CAR DCD (data carrier detect)
TIOCM_CD  Synonym for TIOCM_CAR
TIOCM_RNG RNG (ring)
TIOCM_RI  Synonym for TIOCM_RNG
TIOCM_DSR DSR (data set ready)
*/
int RS232_IsCTSEnabled(int handle)
{
  int status;

  ioctl((int handle, TIOCMGET, &status);

  if(status&TIOCM_CTS) return(1);
  else return(0);
}








5/29/2013

Serial Port (RS232C) WaitCommEvent Timeout Method.


linux - use select time out check.

win32 - use overlapped method. 

Open Serial Port Option by Overlapped.

HANDLE SPortHandle=
CreateFile (.. .. FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL,NULL);

//
// check serial port data
//
int isindataserialport(Cport , msec )
{
    int ret=1; // true , false;
    DWORD fdwCommMask;
    SetCommMask (Cport,/*EV_CTS | EV_DSR| */ EV_RXCHAR);
    #ifdef _WIN32_WCE
        WaitCommEvent (Cport, &fdwCommMask, 0);
    #else
        OVERLAPPED OverLapped;
        memset ((char *)&OverLapped, 0, sizeof(OVERLAPPED));
        OverLapped.hEvent = CreateEvent (NULL, TRUE, TRUE, 0);
        if (!WaitCommEvent (Cport, &fdwCommMask, &OverLapped))
       {
            if (GetLastError() == ERROR_IO_PENDING)
            {
                if(WaitForSingleObject (OverLapped.hEvent,(DWORD) msec) != WAIT_OBJECT_0)
                {
                     ret=0;
                }
            }
        }
        CloseHandle(OverLapped.hEvent);
    #endif

    if((fdwCommMask & EV_RXCHAR) != EV_RXCHAR)
   {
        ret=0;
    }
    return ret;
}