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

📄 digitizer.cpp

📁 数字化仪读取程序,用于绘图 设计等的数据输入
💻 CPP
字号:
// Digitizer.cpp: implementation of the CDigitizer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "dinput.h"
#include "Digitizer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDigitizer::CDigitizer()
{
	m_digicfg.digiport = COM1;
	m_digicfg.digisize = AT_A0;
	m_digicfg.digitype = 23;						// hipo & Richpeace
	ReadCfg("digi.ini");
}

CDigitizer::~CDigitizer()
{
	WriteCfg("digi.ini");
}

int CDigitizer::OpenComm()
{
	DWORD dwError;
	DCB dcbCommPort;
	COMMTIMEOUTS commtimeouts;
	DWORD evtmask;
  CString str1,str2;  
	int nDigitizerType = 23;

  switch (m_digicfg.digiport) {
  case COM1:
    m_sCommPortName="COM1";
    break;
  case COM2:
    m_sCommPortName="COM2";
    break;
  case COM3:
    m_sCommPortName="COM3";
    break;
  case COM4:
    m_sCommPortName="COM4";
    break;
  }

	m_hCommPort=CreateFile(LPCTSTR(m_sCommPortName),
                         GENERIC_READ | GENERIC_WRITE,
                         0,NULL,OPEN_EXISTING,0,NULL);           

	if (m_hCommPort == INVALID_HANDLE_VALUE)  
	{
		dwError=GetLastError();		            //得到上次操作的错误信息
//    str2.LoadString(IDS_RPGRADESYSTEM);   //富怡放码系统
		switch (dwError)  {
		case ERROR_BUSY:
      str1.LoadString(IDS_COMMPORTBUSY); //通讯口正在使用!
			break;
		default:
      str1.LoadString(IDS_COMMPORTOPENERROR); //通讯口不能打开!
			break;
		}
		AfxMessageBox(str1);
//		gl_pWorkWindow->MessageBox(str1,str2,MB_OK | MB_ICONSTOP);
	}
	else  
	{
    switch(nDigitizerType)  {
    case 4:		
    case 5:		
    case 6:		
    case 7:   //calcomp
    case 8:   //calcomp
    case 9:   //calcomp
    case 12:  //Numonics
    case 13:  //Numonics
    case 14:  //Numonics
    case 15:  //calcomp
		case 18:	//CD_912
    case 23:  //Hipo,Richpeace
		case 24:	//Altek 16_Key
		case 25:	//Gerber
      SetupComm(m_hCommPort,12,10);
      break;
    case 16:  //summasketch A4
      SetupComm(m_hCommPort,10,10);	
      break;
    case 20:  //summasketch A3
      SetupComm(m_hCommPort,10,6);	
      break;
    default:
      SetupComm(m_hCommPort,16,10);	
    }
		evtmask=EV_RXCHAR | EV_DSR | EV_RX80FULL | EV_RXFLAG;
		SetCommMask(m_hCommPort,evtmask);	            //specifies a set of events to be monitored监控 
		PurgeComm(m_hCommPort,PURGE_TXCLEAR | PURGE_RXCLEAR);	//Clears the output buffer (if the device driver has one).
    //设置读串口时间限制
		GetCommTimeouts(m_hCommPort,&commtimeouts);
		commtimeouts.ReadTotalTimeoutMultiplier=2;    
		commtimeouts.ReadTotalTimeoutConstant=2;      
		SetCommTimeouts(m_hCommPort,&commtimeouts);

		if (m_sCommPortName.Left(3) == _T("COM"))  {
			dcbCommPort.DCBlength=sizeof(DCB);
			GetCommState(m_hCommPort,&dcbCommPort);
			dcbCommPort.BaudRate=CBR_9600;							//9600
			dcbCommPort.ByteSize=8;											//8
			dcbCommPort.Parity=EVENPARITY;							//2=偶校验
			dcbCommPort.StopBits=ONESTOPBIT;						//1位停止位
      switch(nDigitizerType)  {
      case 2:
      case 3:
      case 19:  
			  dcbCommPort.ByteSize=7;											//7
			  dcbCommPort.StopBits=TWOSTOPBITS;						//2位停止位
        break;
      case 20:  //summasketch A3
      case 16:  //summasketch A4
        dcbCommPort.Parity=ODDPARITY;							  //2=奇校验
        break;
      case 18:
      case 21:
      case 22:
      case 23:  //Hipo,Richpeace
			case 24:	//Altek 16_Key
			case 25:	//Gerber
        dcbCommPort.Parity=NOPARITY;							  //0=NO校验
        break;
      }

			dcbCommPort.fOutxDsrFlow=false;							//DSR output flow control DSR=数据准备好
			dcbCommPort.fDtrControl=DTR_CONTROL_ENABLE; // DTR flow control type  DTR=数据终端准备好
			dcbCommPort.fOutxCtsFlow=false;							// CTS output flow control CTS=清除发送
			dcbCommPort.fRtsControl=RTS_CONTROL_ENABLE;	// RTS flow control 请求发送
      dcbCommPort.fInX=false;
      dcbCommPort.fOutX=false;	
			dcbCommPort.fBinary=true;	      //必须为二进制方式
			dcbCommPort.fParity=true;	      //要奇偶校验
			SetCommState(m_hCommPort,&dcbCommPort);
		}
	}
	return 1;
}

int CDigitizer::ReadData()
{
	int i,n,k=0,noldPH=0;
	long xydata;
	long xy[10];
  char m_szBuffer[20];
  unsigned long dwBytesRead;
  DWORD dwEvtMask;
  BOOL b_DigitizerDataStart=false;
	int nDigitizerType = m_digicfg.digitype;


  switch (nDigitizerType) {	//数化板类型
  case 4:
  case 5:
  case 6:
  case 7: 
  case 8:  //Calcomp A0 16_Key(0123..)A
  case 9:
  case 12: //Numonics AccuGrid A0 16_Key(123C..)  
  case 13: //Numonics AccuGrid A0 16_Key(0123..)  
  case 14: //Numonics AccuGrid A0 4_Key           
  case 21: //GTCO Roll Up 16_Key(0123..)          
  case 15: //Calcomp A0 16_Key(0123..)B 
  case 18: //CD-912 A0 16_Key A
  case 23: //Hipo
	case 24: //Altek 16_Key
	case 25: //Gerber 16_key
    m_nSizeDigitizerData=6;
    break;
  }
	m_nToReadCharCount=m_nSizeDigitizerData*2;  //要读的字节数
  n=m_nToReadCharCount;
  m_nReadCount=0;          //已实际接收完的字节数
  dwBytesRead=0;           //本次实际接收的字节数

  //----------------------------------
  //一个字节一个字节读入,直到足够用,
  //----------------------------------
  while ((n > 0) && (m_nReadCount < m_nToReadCharCount))
	{
	  GetCommMask(m_hCommPort,&dwEvtMask);  
	  if (!(dwEvtMask & EV_RXFLAG))  //有一个字符在接收缓冲区?
		{
      return m_nReadCount; 
    } 

    if (ReadFile(m_hCommPort,&m_szBuffer[m_nReadCount],	    //接收数据缓冲区
                1,
				  	    &dwBytesRead,	NULL))  
		{		
			if (dwBytesRead == 0)  //没读回数据
			{
				return m_nReadCount; 
			}

			switch (nDigitizerType) 	//数化板类型
			{
      case 23:    //Hipo,Richpeace														
        if ((m_szBuffer[m_nReadCount] & 0x80) != 0) 
				{
          if (!b_DigitizerDataStart) 
					{
            b_DigitizerDataStart=true;
          }
          else 
					{
            m_szBuffer[noldPH]=0;
          }
          n=m_nSizeDigitizerData;
          noldPH=m_nReadCount;
        }
        break;
      }
		  m_nReadCount=m_nReadCount + dwBytesRead;	
      n=n-dwBytesRead;
    }
    else     //读数据失败!
		{
      return m_nReadCount; 
    }

    if ((m_nReadCount > m_nSizeDigitizerData) && (!b_DigitizerDataStart)) 
		{
      break;
    } 
  }

  if (!b_DigitizerDataStart) 
	{
    return m_nReadCount;
  } 

  if ((m_nReadCount == m_nToReadCharCount) || (n == 0)) 
	{
    switch (nDigitizerType) 
		{
		case 23:    //Hipo,Richpeace
			for (i=0;i<m_nReadCount;i++)	
			{
				if ((m_szBuffer[i] & 0x80) != 0)	
				{ 

					if ((m_szBuffer[i+3] & 0xE0) != 0)  //干扰
					{
            return m_nReadCount;
						break;
					}

					if (i > m_nReadCount-m_nSizeDigitizerData)	 //有效数据不够用!
					{
            return m_nReadCount;
						break;
					}
        
          xy[0]=(m_szBuffer[i] >> 2) & 0x0f;  

					xydata=(long)(m_szBuffer[i+2] & 0x7f)	+ (long)(m_szBuffer[i+1] & 0x7f)*128 + (long)(m_szBuffer[i] & 3)*16384;
          if ((m_szBuffer[i+3] & 8) != 0) 
					{
            xydata=xydata+16384*4;
          }
          xydata=(long)((double)xydata*1.016); 
					xy[1]=xydata & 0xff;
					xy[2]=(xydata >> 8) & 0xff;
					xy[3]=(xydata >> 16) & 0xff;
					xy[4]=(xydata >> 24) & 0xff;

					xydata=(long)(m_szBuffer[i+5] & 0x7f)	+ (long)(m_szBuffer[i+4] & 0x7f)*128 + (long)(m_szBuffer[i+3] & 7)*16384;
          xydata=(long)((double)xydata*1.016); 
          //左下角为(0,0)点,转换为左上角为(0,0)点
					int lpmm = 40;

          switch (m_digicfg.digisize) {
          case AT_A00:
            xydata=(long)(44*25.4*lpmm - xydata);  
            break;
          case AT_A0:
            xydata=(long)(36*25.4*lpmm - xydata);  
            break;
          case AT_A1:
            xydata=(long)(24*25.4*lpmm - xydata);  
            break;
          case AT_A2:
            xydata=(long)(18*25.4*lpmm - xydata);  
            break;
          case AT_A3:
          case AT_A4:
            xydata=(long)(12*25.4*lpmm - xydata);  
            break;
          }

					xy[5]=xydata & 0xff;
					xy[6]=(xydata >> 8) & 0xff;
					xy[7]=(xydata >> 16) & 0xff;
					xy[8]=(xydata >> 24) & 0xff; 
				} 
			} 
      break;
    }
  }
	for(i = 0; i < 10; i ++)
		m_xy[i] = xy[i];

  return m_nReadCount;
}


int CDigitizer::ReadCfg(CString fname)
{
	CFile cfgfile;
	if(cfgfile.Open(fname, CFile::modeRead))
	{
		cfgfile.SeekToBegin();
		cfgfile.Read(&m_digicfg.digiport, sizeof(m_digicfg.digiport));
		cfgfile.Read(&m_digicfg.digisize, sizeof(m_digicfg.digisize));
		cfgfile.Read(&m_digicfg.digitype, sizeof(m_digicfg.digitype));
		cfgfile.Close();
	}
	else
	{
		m_digicfg.digiport = COM1;
		m_digicfg.digisize = AT_A0;
		m_digicfg.digitype = 23;
		WriteCfg("digi.ini");
	}
	return 1;
}

int CDigitizer::WriteCfg(CString fname)
{
	CFile cfgfile;
	if(!cfgfile.Open(fname, CFile::modeWrite))
		cfgfile.Open(fname, CFile::modeWrite | CFile::modeCreate);

	cfgfile.SeekToBegin();
	cfgfile.Write(&m_digicfg.digiport, sizeof(m_digicfg.digiport));
	cfgfile.Write(&m_digicfg.digisize, sizeof(m_digicfg.digisize));
	cfgfile.Write(&m_digicfg.digitype, sizeof(m_digicfg.digitype));
	cfgfile.Close();
	return 1;
}

⌨️ 快捷键说明

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