⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emscom.cpp

📁 在LINUX环境下
💻 CPP
字号:
#include "EMSCom.h"

//------------------------------------------------------------------------------
EmsCom::EmsCom()
{
	  // set default property values
  	m_PortHandle = INVALID_HANDLE_VALUE; // invalidate to start

#ifdef WIN32
	m_ComName = 'COM1';
#else
    	m_ComName = 'ttyS0';
#endif

  	m_BaudRate = 5760;
  	m_DataBits = 8;
  	m_StopBits = 0;
  	m_Parity = 2; //even

  	m_Inuse=false;
  	m_EndChar='';
  	m_IntervalOut=0;
}

//------------------------------------------------------------------------------
EMSCom::~EmsCom()
{
	ToCloseCom();
}

//------------------------------------------------------------------------------
int EmsCom::ToSetBaud(int _BaudRate)
{
	if(m_BaudRate!=_BaudRate)
	{
		m_BaudRate=_BaudRate;
		if(IsOpened())
			ToCloseCom();
		ToOpenCom();
	}
	return 0;
}
//------------------------------------------------------------------------------
int EmsCom::ToSetData(short int _DataBits)// Procedure to set the Data bits
{
	if(m_DataBits!=_DataBits)
	{
		m_DataBits=_DataBits;
		if(IsOpened())
			ToCloseCom();
		ToOpenCom();
	}
	return 0;
}
//------------------------------------------------------------------------------
int EmsCom::ToSetStop(short int _StopBits)// Procedure to set the stop bits
{
	if(m_StopBits!=_StopBits)
	{
		m_StopBits=_StopBits;
		if(IsOpened())
			ToCloseCom();
		ToOpenCom();
	}
	return 0;
}
//------------------------------------------------------------------------------
int EmsCom::ToSetParity(short int _Parity)//Procedure to set the Parity
{
	if(m_Parity!=_Parity)
	{
		m_Parity=_Parity;
		if(IsOpened())
			ToCloseCom();
		ToOpenCom();
	}
	return 0;
}

//----------------------------------------------------------------------
//Opens the COM port, returns True if ok
bool EmsCom::ToOpenCom(void)
{
	string _sTempComName;
	int _TempFileHandle;
  	termios _Opt;


	if(m_PortHandle!=INVALID_HANDLE_VALUE)
	   ToCloseCom();

#ifdef WIN32

#else

  	_sTempComName="/dev/"+m_ComName;
  	_TempFileHandle= open(_sTempComName.c_str(),  RDWR or NOCTTY or NDELAY);
	if (_TempFileHandle!-1)
	   	 m_PortHandle=_TempFileHandle
	else
		m_PortHandle=INVALID_HANDLE_VALUE;
	  
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
		tcgetattr(m_PortHandle, &_Opt);
		memset(_Opt,0,sizeof(_Opt));
		
   		 //tcflush(FPortHandle, TCIOFLUSH);
    		cfsetispeed(_Opt, m_BaudRate);
    		cfsetospeed(_Opt, m_BaudRate);
		switch(m_BaudRate)
		{
      			case 4800:
        			_Opt.c_cflag = B4800 or CS8 | CLOCAL | CREAD;
				break;
      			case 9600:
        			_Opt.c_cflag = B9600 or CS8 | CLOCAL | CREAD;
				break;
      			default:
        			_Opt.c_cflag = B19200 or CS8 | CLOCAL | CREAD;
		}
		
      		_Opt.c_iflag = 0;//INLCR;    
      		_Opt.c_oflag = 0;   
		_Opt.c_lflag = 0;//ICANON;    
		_Opt.c_cflag =_Opt.c_cflag &  (~CSIZE);    

		switch(m_DataBits)
		{
			case 7:
				_Opt.c_cflag = _Opt.c_cflag | CS7;
				break;
  	  		case 8:
				_Opt.c_cflag = _Opt.c_cflag | CS8;
				break;
			default:
				ToCloseCom();
		}
	}
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
		switch(m_Parity)
		{
			case  0:{
          			_Opt.c_cflag =_Opt.c_cflag &  (~PARENB);   // Clear parity enable
		      		_Opt.c_iflag =_Opt.c_iflag &  (~INPCK);     // Enable parity checking
		      		break;
			}
   			case 1:{
          			_Opt.c_cflag =_Opt.c_cflag | (PARODD | PARENB);  // 设置为奇效验*/
		      		_Opt.c_iflag =_Opt.c_iflag | (INPCK);             // Disnable parity checking
		      		break;
   			}
       		case 2:{
		          	_Opt.c_cflag =_Opt.c_cflag | PARENB;     // Enable parity
          			_Opt.c_cflag =_Opt.c_cflag & (~PARODD);   //转换为偶效验*/
          			_Opt.c_iflag =_Opt.c_iflag | INPCK;       //Disnable parity checking */
        			break;
       		}
			case 4:{
			      _Opt.c_cflag =_Opt.c_cflag & (~PARENB);
			      _Opt.c_cflag =_Opt.c_cflag & (~CSTOPB);
				break;
			}
			default:
				ToCloseCom();
		}
	}
				
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
		switch(m_StopBits)
		{
			case 0:
			{
  	  			_Opt.c_cflag =_Opt.c_cflag & (~CSTOPB);
				break;
			}
			case 2:
			{
  	  			_Opt.c_cflag =_Opt.c_cflag | CSTOPB;
				break;
			}
			default:
				ToCloseCom();
		}
	}

  //Set input parity option
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
    		if m_Parity<>0 then
		      _Opt.c_iflag =_Opt.c_iflag | INPCK;

		_Opt.c_cflag =_Opt.c_cflag | CREAD | CLOCAL;
	    	_Opt.c_cc[VTIME] = Char(0);
    		_Opt.c_cc[VMIN] = CHar(0);


    		tcflush(m_PortHandle, TCIOFLUSH);// Update the options and do it NOW
    		if(tcsetattr(m_PortHandle, TCSANOW,_Opt)!=0) 
			ToCloseCom();
		else
		     tcflush(m_PortHandle,TCIOFLUSH);
	}
#endif

	return (m_PortHandle!=INVALID_HANDLE_VALUE);
}


//------------------------------------------------------------------------------
int  EmsCom::ToCloseCom(void)
{
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
	#ifdef WIN32
    		CloseHandle(m_PortHandle);
	#else
	    	__close(m_PortHandle);
	#endif

    	m_PortHandle = INVALID_HANDLE_VALUE;

	return 0;
}

//------------------------------------------------------------------------------
bool EmsCom::ToWriteCom(char *_pByteData,int _iLen)
{
	int _dwWriteLen=0; 

	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
	#ifdef WIN32

	#else
		tcflush(m_PortHandle,TCIOFLUSH);
    		_dwWriteLen =__Write(m_PortHandle,_pByteData, _iLen);
	#endif
	}
	if(_dwWriteLen==_iLen)
	{
		sleep(3);
		return true;
	}
	return false;
}

//------------------------------------------------------------------------------
bool EmsCom::ToReadCom(char *_pByteData,int &_iLen)
{
	int _iReceiveLen=0;
	if (m_PortHandle!=INVALID_HANDLE_VALUE)
	{
	#ifdef WIN32

	#else
    		_iReceiveLen=__Read(m_PortHandle,_pByteData,1);
    		if(_iReceiveLen>0) 
      			_iLen=_iReceiveLen
    		else
      			_iLen=0;
	#endif
	}
	return (_iLen!=0);
}

//------------------------------------------------------------------------------
bool EmsCom::ToReadCom(string _strRead)
{
	unsigned int cbCharsAvailable, cbCharsRead;
	bool boo_FoundTerm;
	sBuffer: String;
  dwCurWaitTime,dwWaitTime:DWORD;
begin
	Result := '';
  { check boo_InUse in case of rentrancy }
	if not FInUse then
  begin
		FInUse := True;
		if FPortHandle <> INVALID_HANDLE_VALUE then
		begin
			{ if no terminator is defined, simply read any available data and return }
			if(Length(self.FEndChar)=0) and (self.FIntervalOut=0) then
			begin
{$IFDEF MSWINDOWS}
				cbCharsAvailable := GetInCount;
				if cbCharsAvailable > 0 then
				begin
					SetLength(sBuffer, cbCharsAvailable + 1); { allocate space }
					ReadFile(FPortHandle, PChar(sBuffer)^, cbCharsAvailable, cbCharsRead, nil);
					SetLength(sBuffer, cbCharsRead); { adjust length }
          Result := sBuffer;
				end;
{$ENDIF}
{$IFDEF LINUX}
        SetLength(sBuffer, 2); { allocate space }
        if(__Read(FPortHandle, PChar(sBuffer)^, 1)=1) then
        begin
          SetLength(sBuffer, 1); { adjust length }
          Result := sBuffer;
        end;
{$ENDIF}
			end else { a terminator is defined, so read port until terminator found or timed out }
	   	begin
		   	boo_FoundTerm := False;
        dwCurWaitTime:=0;
        if self.FIntervalOut<>0 then
          dwWaitTime:=self.FIntervalOut
        else
          dwWaitTime:=60000;//1 min
        Repeat
          {Application.ProcessMessages;}

{$IFDEF MSWINDOWS}
		   		cbCharsAvailable := GetInCount;
			   	if cbCharsAvailable > 0 then
          begin
            dwCurWaitTime:=0;
            SetLength(sBuffer, cbCharsAvailable + 1); { allocate space }
	   				ReadFile(FPortHandle, PChar(sBuffer)^, cbCharsAvailable, cbCharsRead, nil);
            if cbCharsAvailable<>cbCharsRead then
              cbCharsAvailable:=0;
          end;
{$ENDIF}
{$IFDEF LINUX}
          SetLength(sBuffer, 2); { allocate space }
          if(__Read(FPortHandle, PChar(sBuffer)^, 1)=1) then
          begin
            SetLength(sBuffer, 1); { adjust length }
            cbCharsAvailable:=1;
          end else
            cbCharsAvailable:=0;
  {$ENDIF}
          if cbCharsAvailable > 0 then
          begin
            Result := Result + copy(sBuffer,1,cbCharsAvailable);
            if Length(FEndChar) <> 0 then
            begin
              if (Pos(FEndChar, Result) <> 0) then
                boo_FoundTerm := True;
            end;
          end else begin
            dwCurWaitTime:=dwCurWaitTime+10;
            sleep(10);
          end;
        until ((dwCurWaitTime>=dwWaitTime) or boo_FoundTerm);
      end;
    end;
    FInUse := False;
	end;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -