コード例 #1
0
ファイル: Serial.cpp プロジェクト: herreros/baseCam
int CSerial::ReadDataWaiting( void )
{

	if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

	DWORD dwErrorFlags;
	COMSTAT ComStat;

	ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );

	return( (int) ComStat.cbInQue );
}
コード例 #2
0
ファイル: pc_serial.c プロジェクト: olegyurchenko/dda-control
/*----------------------------------------------------------------------------*/
int serial_read(int fd, void *buffer, unsigned size, unsigned timeout)
{
  HANDLE h;
  COMMTIMEOUTS ct;
  int received = 0;

  h = get_h(fd);
  if(!h)
    return 0;

  if(!GetCommTimeouts(h,&ct))
  {
    err_trace(__FILE__, __LINE__);
    return 0;
  }

  ct.ReadIntervalTimeout = MAXDWORD;
  ct.ReadTotalTimeoutMultiplier = MAXDWORD;
  ct.ReadTotalTimeoutConstant = timeout;

  if(!SetCommTimeouts(h,&ct))
  {
    err_trace(__FILE__, __LINE__);
    return 0;
  }

  if(!ReadFile(h, buffer, size, (DWORD *)&received, NULL))
  {
    DWORD Err;
    err_trace(__FILE__, __LINE__);
    ClearCommBreak(h);
    ClearCommError(h, &Err, NULL);
    return 0;
  }

#ifdef DEBUG
  if(!received)
  {
//    err_trace(__FILE__, __LINE__);
//    TRACE("%s:%d: Timeout reached. Timeout: %u\n", __FILE__, __LINE__, timeout );
  }
	else
	{
		int i;
		fprintf(stderr, "rx: ");
		for(i = 0; i < received; i++)
			fprintf(stderr, "%02x ", (unsigned)((char *)buffer)[i] & 0xff);
		fprintf(stderr, "\n");
	}
#endif

  return received;
}
コード例 #3
0
qint64 VirtualSerialDevice::bytesAvailable() const
{
    QMutexLocker locker(&lock);
    if (!isOpen()) return 0;

    qint64 avail = 0;
    COMSTAT Status;
    if (ClearCommError(d->portHandle, NULL, &Status)) {
        avail = Status.cbInQue;
    }
    return avail + QIODevice::bytesAvailable();
}
コード例 #4
0
int	MySerial::Read(void *buffer,int len)
{
	BOOL bReadStat;
	DWORD r_len = 0;
	
	ClearCommError(hCom,&dwErrorFlags,&ComStat);

	while( ComStat.cbInQue == 0 )
	{
		ClearCommError(hCom,&dwErrorFlags,&ComStat);
	}

	bReadStat = ReadFile(hCom,buffer,len,&r_len,NULL);

	PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);

	if(!bReadStat)
		return -1;

	return r_len;
}
コード例 #5
0
ファイル: qserial.cpp プロジェクト: krooks/qsilib
qint64 QSerial::bytesAvailable() {
	if (isOpen()) {
		DWORD Errors;
		COMSTAT Status;
		bool success=ClearCommError(fh, &Errors, &Status);
		if (success) {
			return Status.cbInQue + QIODevice::bytesAvailable();
		}
		return (unsigned int)-1;
	}
	return 0;
}
コード例 #6
0
ファイル: sernt.c プロジェクト: ABratovic/open-watcom-v2
bool TestForBreak( void )
{
    DWORD       errors;
    COMSTAT     comStat;

    if( ClearCommError( hSerial, &errors, &comStat ) ) {
        if( errors & CE_BREAK ) {
            return TRUE;
        }
    }
    return( FALSE );
}
コード例 #7
0
ファイル: io_serial.c プロジェクト: KurtWoloch/fbc
int fb_SerialGetRemaining( FB_FILE *handle,
                           void *pvHandle, fb_off_t *pLength )
{
    W32_SERIAL_INFO *pInfo = (W32_SERIAL_INFO*) pvHandle;
    DWORD dwErrors;
    COMSTAT Status;
    if( !ClearCommError( pInfo->hDevice, &dwErrors, &Status ) )
        return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL );
    if( pLength )
        *pLength = (long) Status.cbInQue;
    return fb_ErrorSetNum( FB_RTERROR_OK );
}
コード例 #8
0
ファイル: serport.cpp プロジェクト: JONA-GA/connector_pi
int wxSerialPort::Ioctl(int cmd,void* args)
{
    COMSTAT comstat;
    DWORD errors;
    int result = 0;
    bool brk;
    switch(cmd) {
    case CTB_RESET:
	   return SendBreak(0);
    case CTB_SER_GETEINFO:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  // actualize the last events
		  if(errors & CE_BREAK) einfo.brk++;
		  if(errors & CE_FRAME) einfo.frame++;
		  if(errors & CE_OVERRUN) einfo.overrun++;
		  if(errors & CE_RXPARITY) einfo.parity++;
		  *(wxSerialPort_EINFO*)args = einfo;
		  return 0;
	   }
    case CTB_SER_GETBRK:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  if(errors & CE_BREAK) result = 1;
		  einfo.brk += result;
		  *(int*)args = result;
		  return 0;
	   }
	   break;
    case CTB_SER_GETFRM:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  if(errors & CE_FRAME) result = 1;
		  einfo.frame += result;
		  *(int*)args = result;
		  return 0;
	   }
    case CTB_SER_GETOVR:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  if(errors & CE_OVERRUN) result = 1;
		  einfo.overrun += result;
		  *(int*)args = result;
		  return 0;
	   }
	   break;
    case CTB_SER_GETPAR:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  if(errors & CE_RXPARITY) result = 1;
		  einfo.parity += result;
		  *(int*)args = result;
		  return 0;
	   }
	   break;
    case CTB_SER_GETINQUE:
	   if(ClearCommError(fd,&errors,&comstat)) {
		  *(int*)args = (int)comstat.cbInQue;
		  return 0;
	   }
	   break;
    }
    // error or unknown command
    return -1;
};
コード例 #9
0
int Send(const char * cmd)
	{
	LOG(ARDUINO_MSG_VERBOSE,"Arduino::SendMsg - msg [%s]",cmd);
	write_lock.Lock();

	DWORD dwwritten = 0; 
	int len = strlen(cmd);

	char buf[256];
	if(len>256)
	{
		write_lock.Unlock();
		LOG(ERR,"Arduino::Send: Msg too long!");
		return -1;
	}

#ifndef USBCAN_PROTOCOL
	// surround message with {}
	sprintf_s(buf,256,"{%s}\r",cmd);
	len += 3;	// {}\r
#else
	sprintf_s(buf,256,"%s\r",cmd);
	len += 1;	// \r
#endif

	if  ( (dwwritten=blockingWrite(buf, len )) == -1)
		{
		LOG(ERR,"Arduino::SendMsg - Blocking write failed ! \n");
		write_lock.Unlock();
		return -1;
		}

	if (dwwritten != len)
		{
		write_lock.Unlock();
		LOG(ERR,"Arduino::SendMsg - Write didn't finish (%d out of %d bytes sent)\n", dwwritten,len);
		DWORD   dwErrors;
		COMSTAT comStat;
		ClearCommError(hCommPort, &dwErrors, &comStat);
		LOG(ERR,"Arduino::SendMsg - ClearCommError: Error flags: 0x%x, bytes in output queue: %d\n", dwErrors, comStat.cbOutQue);		
		return -1;
		}
	write_lock.Unlock();

#ifndef USBCAN_PROTOCOL
	LOG(ARDUINO_MSG_VERBOSE,"Arduino::SendMsg - completed succefully: %d written (%d bytes original)",dwwritten,dwwritten-3);
	return dwwritten-3;
#else
	LOG(ARDUINO_MSG_VERBOSE,"Arduino::SendMsg - completed succefully: %d written (%d bytes original)",dwwritten,dwwritten-1);
	return dwwritten-1;
#endif
}
コード例 #10
0
int SerialPortWrite(char *szBuffer, int count)
{
	// TODO: Add your control notification handler code here
#if 0
	DWORD wCount = 0;
	WriteFile(hCom, szBuffer, count, &wCount, NULL);//发送数据
	return (int)wCount;
#else
	//char buffer[1024];
	//DWORD dwBytesWritten = 1024;
	DWORD dwErrorFlags;
	COMSTAT ComStat;
	OVERLAPPED m_osWrite;
	BOOL bWriteStat;
	DWORD dwRealSend = 0;

	strcat(szBuffer, "\r\n");
	count = count + 2;
	
	ZeroMemory(&m_osWrite, sizeof(m_osWrite));
	if (m_osWrite.hEvent != NULL)
	{
		ResetEvent(m_osWrite.hEvent);
		m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	}
	if (ClearCommError(hCom, &dwErrorFlags, NULL))
	{
		PurgeComm(hCom, PURGE_TXABORT | PURGE_TXCLEAR);
		bWriteStat = WriteFile(hCom, szBuffer, count, &dwRealSend, &m_osWrite);
		if (!bWriteStat)
		{
			if (GetLastError() == ERROR_IO_PENDING)
			{
				while (!GetOverlappedResult(hCom, &m_osWrite, &dwRealSend, FALSE))
				{

					if (GetLastError() == ERROR_IO_INCOMPLETE)
					{
						//cout<<"写未完成,继续!"<     
						continue;
					}
				}
				//WaitForSingleObject(m_osWrite.hEvent, 1000);
				//GetOverlappedResult(hCom, &m_osWrite, (DWORD*)(&count), TRUE);
				return count;
			}
			return 0;
		}
	}
	return count;
#endif
}
コード例 #11
0
ファイル: w32_uart.c プロジェクト: 12019/mtktest
void CheckReadyToWrite(UART_PORT port)
{
    COMSTAT	comstat;
    DWORD	errors;
    if(ClearCommError(UARTHandle[port], &errors, &comstat))
    {
        if(comstat.fCtsHold==0 && comstat.fXoffHold==0 && comstat.fXoffSent==0)
        {            
			UART_sendilm(port, MSG_ID_UART_READY_TO_WRITE_IND);
            breadytowrite[port] = FALSE;
        }
    }            
}
コード例 #12
0
ファイル: w32_uart.c プロジェクト: 12019/mtktest
void CheckReadyToRead(UART_PORT port)
{
    COMSTAT	comstat;
    DWORD	errors;
    if(ClearCommError(UARTHandle[port], &errors, &comstat))
    {
        if(comstat.cbInQue)        
        {
            UART_sendilm(port, MSG_ID_UART_READY_TO_READ_IND);
            breadytoread[port] = FALSE;
        }
    }        
}
コード例 #13
0
ファイル: ndicapi_serial.c プロジェクト: Beastmaster/AIGS
int ndiSerialBreak(HANDLE serial_port)
{
  DWORD dumb;

  ClearCommError(serial_port,&dumb,NULL);       /* clear error */
  PurgeComm(serial_port,PURGE_TXCLEAR|PURGE_RXCLEAR); /* clear buffers */

  SetCommBreak(serial_port);
  Sleep(300);                            /* hold break for 0.3 seconds */ 
  ClearCommBreak(serial_port);

  return 0;
}
コード例 #14
0
ファイル: SerialPort_Windows.c プロジェクト: psbs/jSerialComm
JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAvailable(JNIEnv *env, jobject obj, jlong serialPortFD)
{
	HANDLE serialPortHandle = (HANDLE)serialPortFD;
	if (serialPortHandle == INVALID_HANDLE_VALUE)
		return -1;

	COMSTAT commInfo;
	if (!ClearCommError(serialPortHandle, NULL, &commInfo))
		return -1;
	DWORD numBytesAvailable = commInfo.cbInQue;

	return (jint)numBytesAvailable;
}
コード例 #15
0
int xbee_ser_rx_used( xbee_serial_t *serial)
{
	COMSTAT	stat;

	XBEE_SER_CHECK( serial);

	if (ClearCommError( serial->hCom, NULL, &stat))
	{
		return (int) stat.cbInQue;
	}

	return 0;
}
コード例 #16
0
ファイル: CommBaseC.cpp プロジェクト: radioflash/Winsh.lua
// Returns the number of bytes in the transmission queue.
int JHCommBase::BytesInTxQueue()
{
	COMSTAT cs;
	DWORD er;
	if (hPort != INVALID_HANDLE_VALUE)
	{
		if (ClearCommError(hPort, &er, &cs))
		{
			return cs.cbOutQue;
		}
	}
	return -1;
}
コード例 #17
0
ファイル: pc_serial.c プロジェクト: olegyurchenko/dda-control
/*----------------------------------------------------------------------------*/
unsigned serial_rxlen(int fd)
{
  HANDLE h;
  DWORD err;
  COMSTAT stat;
  h = get_h(fd);
  if(h)
  {
    ClearCommError(h, &err, &stat);
    return stat.cbInQue;
  }
  return 0;
}
コード例 #18
0
void CDirectSerial::CheckErrors() {
	
	DWORD errors=0;
	// check for errors
	if (ClearCommError (hCom, &errors, NULL))
		if (errors & (CE_BREAK | CE_FRAME | CE_RXPARITY)) {
			Bit8u errreg = 0;
			if (errors & CE_BREAK) errreg |= LSR_RX_BREAK_MASK;
			if (errors & CE_FRAME) errreg |= LSR_FRAMING_ERROR_MASK;
			if (errors & CE_RXPARITY) errreg |= LSR_PARITY_ERROR_MASK;
			receiveError (errreg);
		}
}
コード例 #19
0
ファイル: ser-mingw.c プロジェクト: sergiodj/gdb-sergio
static void
ser_windows_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
{
    struct ser_windows_state *state;
    COMSTAT status;
    DWORD errors;
    HANDLE h = (HANDLE) _get_osfhandle (scb->fd);

    state = scb->state;

    *except = state->except_event;
    *read = state->ov.hEvent;

    if (state->in_progress)
        return;

    /* Reset the mask - we are only interested in any characters which
       arrive after this point, not characters which might have arrived
       and already been read.  */

    /* This really, really shouldn't be necessary - just the second one.
       But otherwise an internal flag for EV_RXCHAR does not get
       cleared, and we get a duplicated event, if the last batch
       of characters included at least two arriving close together.  */
    if (!SetCommMask (h, 0))
        warning (_("ser_windows_wait_handle: reseting mask failed"));

    if (!SetCommMask (h, EV_RXCHAR))
        warning (_("ser_windows_wait_handle: reseting mask failed (2)"));

    /* There's a potential race condition here; we must check cbInQue
       and not wait if that's nonzero.  */

    ClearCommError (h, &errors, &status);
    if (status.cbInQue > 0)
    {
        SetEvent (state->ov.hEvent);
        return;
    }

    state->in_progress = 1;
    ResetEvent (state->ov.hEvent);
    state->lastCommMask = -2;
    if (WaitCommEvent (h, &state->lastCommMask, &state->ov))
    {
        gdb_assert (state->lastCommMask & EV_RXCHAR);
        SetEvent (state->ov.hEvent);
    }
    else
        gdb_assert (GetLastError () == ERROR_IO_PENDING);
}
コード例 #20
0
int CSeries::SerRead(BYTE *pszBuf, int RecvCnt, int TimeOut)
{
	BOOL        fReadStat;
	DWORD       OldCount,Count,dwReaded, dwError;
	DWORD       dwErrorFlags;
	COMSTAT		ComStat;
	DWORD		i=0;

	OldCount=GetTickCount();
	while (1)
	{
		ClearCommError(m_CommPort, &dwErrorFlags, &ComStat);
		fReadStat = ReadFile(m_CommPort, pszBuf+i, RecvCnt-i,
			&dwReaded, NULL);

		if (!fReadStat)
		{
			dwError = GetLastError();
			// some other error occurred
			ClearCommError(m_CommPort, &dwErrorFlags, &ComStat);
			return -1;
		}

		if(dwReaded ==0)
		{
			Count=GetTickCount();
			if(Count-OldCount>=(unsigned long)TimeOut) //修改:timeout为int型 ,强制转换为UL
				return -2;
			Sleep(10);
		}
		else
		{
			i += dwReaded;	
			if (i >= (unsigned long)RecvCnt)//修改:timeout为int型 ,强制转换为UL
				return 0;
		}
	} 
}
コード例 #21
0
ファイル: com.cpp プロジェクト: roland-wilhelm/iot
//............................................................................
int comRead(unsigned char *buf, size_t size) {
    DWORD n;
    if (!ReadFile(l_com, buf, (DWORD)size, &n, NULL)) {
        printf("*** Reading serial port failed; GetLastError=%ld\n",
               GetLastError());
        DWORD errors;
        COMSTAT comstat;
        ClearCommError(l_com, &errors, &comstat);
    }
    if (_kbhit()) {
        return -1;                                                // terminate
    }
    return (int)n;
}
コード例 #22
0
ファイル: port.c プロジェクト: Ingenico/ruby-rs-232
VALUE bytesAvailableIO(VALUE self)
{
    PortDescriptor *port = NULL;

    Data_Get_Struct(self, PortDescriptor, port);

    DWORD   Errors;
    COMSTAT Status;
    if (ClearCommError(port->fd, &Errors, &Status))
    {
        return INT2FIX(Status.cbInQue);
    }
    return INT2FIX(0);
}
コード例 #23
0
ファイル: Camera.cpp プロジェクト: LeeBn/Navigation
int Camera::sendCommand(const unsigned char* cmd, int cmdLen)
{
	COMSTAT ComStat;
	DWORD dwErrorFlag;
	ClearCommError(m_hSeries, &dwErrorFlag, &ComStat);
	DWORD nWrite;
	if(!WriteFile(m_hSeries, cmd, cmdLen, &nWrite, NULL))
	{
		::MessageBoxA(NULL, "·¢ËÍʧ°Ü", NULL, NULL);
		return -1;
	}
	FlushFileBuffers(m_hSeries);
	return 0;
}
コード例 #24
0
ファイル: net_serial.cpp プロジェクト: liupengsyk/rplidar_ros
size_t raw_serial::rxqueue_count()
{
    if  ( !isOpened() ) return 0;
    COMSTAT  com_stat;
    DWORD error;
    DWORD r_len = 0;

    if(ClearCommError(_serial_handle, &error, &com_stat) && error > 0)
    {
        PurgeComm(_serial_handle, PURGE_RXABORT | PURGE_RXCLEAR);
        return 0;
    }
    return com_stat.cbInQue;
}
コード例 #25
0
ファイル: RS485.cpp プロジェクト: sh894/RailwayControlSystem
bool RS485::send(frame &frm){
	DWORD dwBytesWrite=frm.getLength();
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	BOOL bWriteStat;
	ClearCommError(hCom,&dwErrorFlags,&ComStat);
	bWriteStat=WriteFile(hCom,frm.getFrame(),dwBytesWrite,& dwBytesWrite,NULL);
	if(!bWriteStat)
	{
		std::cout<<"写串口失败"<<std::endl;
		return false;
	}
	return true;
}
コード例 #26
0
tInt32 Serial::cRawSerialDevice::BytesAvailable()
{    
    int bytesAvailable = 0;
#ifndef     WIN32
    ioctl(m_FileDescriptorSerial, FIONREAD, &bytesAvailable);
#else
    DWORD status;
    COMSTAT comStat;
    ClearCommError((HWND)(m_hDevice),&status, &comStat);
    bytesAvailable = (tInt32)comStat.cbInQue;
#endif
    //std::cout << "Bytes available on FileDesc: " << FileDescriptorSerial << "\t Bytes: " << bytesAvailable << std::endl;
    return bytesAvailable;
}
コード例 #27
0
ファイル: serial.c プロジェクト: jantman/scantool.net
int read_comport(char *response)
{
   char *prompt_pos = NULL;
   int i;
   
#ifdef ALLEGRO_WINDOWS
   DWORD bytes_read = 0;
   DWORD errors;
   COMSTAT stat;
   int j;
   
   response[0] = '\0';
   ClearCommError(com_port, &errors, &stat);
   if (stat.cbInQue > 0)
      ReadFile(com_port, response, stat.cbInQue, &bytes_read, 0);
   
   // Remove extraneous 0s
   for (i = 0, j = 0; i < bytes_read; i++)
      if (response[i] > 0)
         response[j++] = response[i];
   response[j] = 0;
#else
   char c;
   
   i = 0;
   while((c = comm_port_test(com_port)) >= 0) // while the serial buffer is not empty, read comport
      if (c > 0)
         response[i++] = c;
   response[i] = 0;
#endif
   
   prompt_pos = strchr(response, '>');
   if (prompt_pos != NULL)
   {
#ifdef LOG_COMMS
      write_comm_log("RX", response);
#endif
      *prompt_pos = '\0'; // erase ">"
      return PROMPT;      // command prompt detected
   }
   else if (strlen(response) == 0)  // if the string is empty,
      return EMPTY;
   else                         //otherwise,
   {
#ifdef LOG_COMMS
      write_comm_log("RX", response);
#endif
      return DATA;
   }
}
コード例 #28
0
bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
	DWORD bytesSend;

	//Try to write the buffer on the Serial port
	if (!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
	{
		//In case it don't work get comm error and return false
		ClearCommError(this->hSerial, &this->errors, &this->status);
		return false;
	}
	else
		return true;
}
コード例 #29
0
void CSerialPort::Flush()
{
	DWORD comError = 0;
	COMSTAT comStat;

	if (!ClearCommError (_hSerial, &comError, &comStat)) {
		//TRACE ("ERROR: ClearCommError(): %s", GetLastErrorString());
		return;
	}
	if (!PurgeComm (_hSerial, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR)) {
		//TRACE ("ERROR: PurgeComm(): %s", GetLastErrorString());
		return;
	}
}
コード例 #30
0
//-----------------------------------------------------------------------------
int ComPortThread::ReadCOMMBytes(void *pData, int length) 
{

	// Variables
	COMSTAT		ComStat;
	DWORD		dwLength;
	DWORD		dwErrorFlags;

	// Try to read length bytes
	ClearCommError(m_hComDev, &dwErrorFlags, &ComStat);
	ReadFile(m_hComDev, pData, ((DWORD) length), &dwLength, NULL);

	return dwLength;
} // end of ReadCOMMBytes