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

📄 ca2ipro.cpp

📁 民航二所单片机驱动开发
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			int nSen = 0;
			for(int k=0; k<32; k++)
			{
				if(pData[k+4] != 0)
					nSen = k;
			}
			m_nMaxNo[pPac->nSubType] = (nSen+1)*8;
		}
		while (position)
		{
			ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
			switch (pPac->nRegType)
			{
			case  MULTISP_REG :
				idNo->plcValue.byteVal = pData[idNo->wNo+2];
				m_nSelectLoopNo[idNo->wNo] = pData[idNo->wNo+2];
				SetLoopNum(pData+3);
				idNo->wQualities = 0xc0;
				break;
			case  ADAPTER_REG :
				{
					int m_nTemp = 0;
					m_nTemp = (int)pData[2];
					/**///m_nSleepTime[m_nTemp] = (int)((pData[3]+18)*3*0.02)+5;//根据回路子站数计算
					idNo->plcValue.byteVal = pData[idNo->wNo+3];
					m_nTemp = m_nTemp*33+idNo->wNo;
					m_nHaveSensor[m_nTemp] = pData[idNo->wNo+3];
					idNo->wQualities = 0xc0;
					break;
				}
			case  MSPDATA_REG :
			case  SENDATA_REG :
				{
					BYTE nLoopNum = 0;
					BYTE nRemainder = pData[3]%4;
					if( nRemainder == 0)
						nLoopNum = pData[3]/4;
					else
						nLoopNum = 1+( (pData[3]-nRemainder)/4 );					

					if(idNo->wNo == 0 )
					{//数据有效判断码
						idNo->plcValue.byteVal = pData[nSend-3];
						m_bData0 = pData[nSend-3];
					}
					else if(idNo->wNo == 33)
					{//子站长度
						idNo->plcValue.byteVal = pData[3];
						m_bData33 = pData[3];
					}
					else if(idNo->wNo == 34)
					{
						idNo->plcValue.byteVal = pData[nSend-3];
						m_bData34 = pData[nSend-3];
					}
					else
					{
						if(idNo->wNo<=nLoopNum)
						{//计算字站灯及检测器的数据
							memset(m_nData, 0, sizeof(m_nData));
							memcpy(m_nData, pData+4, nLoopNum);
#ifdef OUT_DEBUG_MESSAGE
							memset(buf, 0, sizeof(buf));
							sprintf(buf, " 回路%d数据%d:", pPac->nSubType, nLoopNum);
							for (int j=0; j<nLoopNum; j++)
							{
								itoa((BYTE)m_nData[j], buf+strlen(buf), 16); 
								strcat(buf + strlen(buf), " ");
							}
							ShowMessage(buf);
#endif
							idNo->plcValue.byteVal = GetData(m_nData, idNo->wNo, pPac->nRegType, nLoopNum);
							//idNo->plcValue.byteVal = pData[idNo->wNo+3];
						}
					}
					if(idNo->wNo == 34)
					{
						idNo->wQualities = 0xc0;
					}
					else if(idNo->wNo == 0)//(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
					{
						if(pData[nSend-3] == 0xC0 || pData[nSend-3] == 0xCC)
						{
							idNo->wQualities = 0xc0;
						}
						else
						{
							idNo->wQualities = 0xa0;
						}
					}
					else if(idNo->wNo == 33)
					{
						idNo->wQualities = 0xc0;
					}
					else
					{
						if(pData[nSend-3] == 0xC0)
						{
							idNo->wQualities = 0xc0;
						}
						else
						{
							idNo->wQualities = 0xa0;
						}
					}
					if(idNo->wNo > nLoopNum && idNo->wNo != 33 && idNo->wNo != 34)
					{
						idNo->wQualities = 0xa0;
					}

/*					BYTE nLoopNum = 0;
					BYTE nRemainder = pData[3]%8;
					if( nRemainder == 0)
						nLoopNum = pData[3]/8;
					else
						nLoopNum = 1+( (pData[3]-nRemainder)/8 );					
					if(idNo->wNo == 0 )
					{
						idNo->plcValue.byteVal = pData[nSend-3];
					}
					else if(idNo->wNo == 33)
					{
						idNo->plcValue.byteVal = pData[3];
					}
					else
					{
						if(idNo->wNo<=nLoopNum)
						{
							idNo->plcValue.byteVal = pData[idNo->wNo+3];
						}
					}
					
					if(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
					{
						idNo->wQualities = 0xc0;
					}
					else
					{
						idNo->wQualities = 0xa0;
					}
					if(idNo->wNo > nLoopNum && idNo->wNo != 33 )
					{
						idNo->wQualities = 0xa0;
					}
*/					m_nLastLoopNum = pPac->nSubType;//ljh add 2002-11-26
					m_nLastRegType = pPac->nRegType;//ljh add 2002-11-26
					m_nLastDataLen = nLoopNum;//ljh add 2002-11-26
					break;
				}
			case DKSDATA_REG:
			case DKGDATA_REG:
				{
					BYTE nLoopNum = 0;
					BYTE nRemainder = pData[3]%8;
					if( nRemainder == 0)
						nLoopNum = pData[3]/8;
					else
						nLoopNum = 1+( (pData[3]-nRemainder)/8 );					
		
					if(idNo->wNo == 0 )
					{//数据有效判断码
						idNo->plcValue.byteVal = pData[nSend-3];
					}
					else if(idNo->wNo == 33)
					{//子站长度
						idNo->plcValue.byteVal = pData[3];
					}
					else if(idNo->wNo == 34)
					{
						idNo->plcValue.byteVal = pData[nSend-3];
					}
					else
					{//灯坑水数据
						if(idNo->wNo<=nLoopNum)
						{
							idNo->plcValue.byteVal = pData[idNo->wNo+3];
						}
					}

					if(idNo->wNo == 34)
					{//无论何值都更新
						idNo->wQualities = 0xc0;
					}
					else if(idNo->wNo == 0)//(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
					{//C0 CC 时更新,其他值不更新
						if(pData[nSend-3] == 0xC0 || pData[nSend-3] == 0xCC)
						{
							idNo->wQualities = 0xc0;
						}
						else
						{
							idNo->wQualities = 0xa0;
						}
					}
					else if(idNo->wNo == 33)
					{//无论何值都更新
						idNo->wQualities = 0xc0;
					}
					else
					{//C0时更新,其他值不更新
						if(pData[nSend-3] == 0xC0)
						{
							idNo->wQualities = 0xc0;
						}
						else
						{
							idNo->wQualities = 0xa0;
						}
					}

					if(idNo->wNo > nLoopNum && idNo->wNo != 33 && idNo->wNo != 34)
					{
						idNo->wQualities = 0xa0;
					}
					break;
				}
			default :
				break;
			}
			//idNo->wQualities = 0xc0;
			CoFileTimeNow(&idNo->ftTimeStamps);
		}
	}
	else
	{
		return TRUE;
	}

	return bPacSuc;	
}

BOOL  CCA2IPro::CheckDigit(PPACKET pPac, BYTE *buf, int nLen)
{
	BOOL bRetval = RECEIVE_ERROR_RECEIVED;
	int nDataLen = 0;  
	if(pPac->nPacketType == PT_WRITE)
	{
		if (nLen >= 3 && buf[0] == 0xaa)
			bRetval = RECEIVE_RECEIVED;
		else
			bRetval = RECEIVE_ERROR_RECEIVED;
		if(bRetval == RECEIVE_RECEIVED && pPac->nRegType == TON_REG)
		{
			IdNo2 *pIdNo = (IdNo2*)pPac->varList.GetHead();
			if(pIdNo->plcValue.bitVal)
				m_bOn = TRUE;
			else
				m_bOn = FALSE;
		}
		if(bRetval == RECEIVE_RECEIVED && pPac->nRegType == TOFF_REG)
			m_bOn = FALSE;
	}
	if(pPac->nPacketType == PT_READ)
	{
		switch (pPac->nRegType)
		{
		case  MULTISP_REG :
			if (nLen >= 9 && buf[0] == 0xc3 && buf[8] == 0x68)
			   bRetval = RECEIVE_RECEIVED;
			else
			   bRetval = RECEIVE_ERROR_RECEIVED;
			break;
		case  ADAPTER_REG :
			if (nLen >= 38 && buf[0] == 0xc9 && buf[37] == 0x68)
			   bRetval = RECEIVE_RECEIVED;
			else
			   bRetval = RECEIVE_ERROR_RECEIVED;
			break;
		case  MSPDATA_REG :	
		case  SENDATA_REG :
			{
				BYTE nDataLen = 0;
				BYTE nLoopNum = 0;
				BYTE nRemainder = buf[3]%4;
				if( nRemainder == 0)
					nLoopNum = buf[3]/4;
				else
					nLoopNum = 1+( (buf[3]-nRemainder)/4 );
				//nLoopNum = 2*nLoopNum;
				nDataLen = buf[1];
				if(nLen>= (7+nLoopNum) && buf[0] == 0x9c && buf[7+nLoopNum-1] == 0x68)
				//if(nLen>= (7+nDataLen) && buf[0] == 0x9c && buf[7+nDataLen-1] == 0x68)
				{
					bRetval = RECEIVE_RECEIVED;
				}
				else
				{
					bRetval = RECEIVE_ERROR_RECEIVED;
				}
				break;
			}
		case  DKSDATA_REG :
		case  DKGDATA_REG:
			{
				BYTE nDataLen = 0;
				BYTE nLoopNum = 0;
				BYTE nRemainder = buf[3]%8;
				if( nRemainder == 0)
					nLoopNum = buf[3]/8;
				else
					nLoopNum = 1+( (buf[3]-nRemainder)/8 );
				//nLoopNum = 2*nLoopNum;
				nDataLen = buf[1];
				if(nLen>= (7+nLoopNum) && buf[0] == 0x7A && buf[7+nLoopNum-1] == 0x68)
				//if(nLen>= (7+nDataLen) && buf[0] == 0x7A && buf[7+nDataLen-1] == 0x68)
				{
					bRetval = RECEIVE_RECEIVED;
				}
				else
				{
					bRetval = RECEIVE_ERROR_RECEIVED;
				}
				break;
			}
		default :
			bRetval = RECEIVE_ERROR_RECEIVED;
			break;
		}
	}
	return  bRetval;
}

BYTE  CCA2IPro::CRC_ADD(BYTE *buf, int nLen)
{
    BYTE  bVal = 0;
	for (int n=0; n<nLen; n++)
        bVal += buf[n];

	return bVal;
}

BOOL CCA2IPro::InitialComm(LPVOID pData)
{
 	ComDevice *pcc = (ComDevice *)pData;  
	m_nTimeOut = pcc->timeOut;
    CString  strComm;
	strComm.Empty();
    strComm.Format("\\\\.\\%s", pcc->deviceName);
	HANDLE hComm = CreateFile(strComm, GENERIC_READ | GENERIC_WRITE, 0, 
				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /*| FILE_FLAG_OVERLAPPED*/, NULL);
	if (INVALID_HANDLE_VALUE == hComm)
	{
		m_nLastErrorCode = FAILED_OPEN_COM;
		return FALSE;
	}

	//Setup COM port.
	SetupComm(hComm, 256, 256);
	
	BYTE stopBits;
	switch (pcc->stopBits)
	{
		case 1:
			stopBits = 0;
			break;
		case 2:
			stopBits = 2;
			break;
   		default:
			stopBits = 0;
	}

	DCB dcb;
	GetCommState(hComm, &dcb);
	dcb.BaudRate = (DWORD)pcc->baudRate;
	dcb.ByteSize = (BYTE)pcc->dataBits;
	dcb.StopBits = stopBits;
	dcb.Parity = (BYTE)pcc->parity;
 // dcb.fChEvt = TRUE;
 // dcb.EvtChar = (char)0x0d;

	if (!SetCommState(hComm, &dcb))
	{
		CloseHandle(hComm);
		m_nLastErrorCode = COMMUNICATION_CONFIG_ERROR;
		return FALSE;
	}
	//Set COM event mask.
	DWORD flag = 0;
	flag = EV_RXFLAG;
	SetCommMask(hComm, flag | EV_BREAK);
    // purge any information in the buffer
    PurgeComm(hComm, PURGE_TXABORT | PURGE_RXABORT |
                     PURGE_TXCLEAR | PURGE_RXCLEAR);
    // set up for Non_blocking IO.
	COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    // CBR_9600 is approximately 1byte/ms. For our purposes, allow
    // double the expected time per character for a fudge factor.
    CommTimeOuts.WriteTotalTimeoutMultiplier = 100;//2*CBR_9600/BAUDRATE( npTTYInfo ) ;
    CommTimeOuts.WriteTotalTimeoutConstant = 0;
    SetCommTimeouts(hComm, &CommTimeOuts);

	m_hComm = hComm;

    return  TRUE;
}

BOOL CCA2IPro::GetSendString(PPACKET pPac, BYTE *buf, int &nLen, int &nReceLen)
{
	BYTE *pStart = buf; 
	ID_NO2 *pIdNo = (ID_NO2*)pPac->varList.GetHead();	
	BOOL  bRet = FALSE;
	nLen = 0;
	if (pPac->nPacketType == PT_READ)
	{  
		switch(pPac->nRegType)
		{
		case MULTISP_REG ://查询多路串口参数	
			pStart[nLen++] = 0x55;
			pStart[nLen++] = 7;      
			pStart[nLen++] = 1;
			pStart[nLen++] = 0xff;   
			pStart[nLen++] = 0xff;
			bRet = TRUE;  
			break;
		case ADAPTER_REG ://查询通讯适配器的参数
            pStart[nLen++] = 0x66;
			pStart[nLen++] = 7;      
			pStart[nLen++] = 1;
			//pStart[nLen++] = (char)pIdNo->wNo;  
			pStart[nLen++] = (char)pPac->nSubType;  
			pStart[nLen++] = 0xff;
			bRet = TRUE;  
		    break;
		case MSPDATA_REG ://单回路子站灯数据查询
		case SENDATA_REG ://单回路子站检测器数据查询 
            pStart[nLen++] = 0x66;
			pStart[nLen++] = 7;     
			pStart[nLen++] = 4;
			pStart[nLen++] = (char)pPac->nSubType; 
			pStart[nLen++] = 0xff;
            bRet = TRUE;
			break;
		case DKSDATA_REG ://单回路灯坑水数据查询
            pStart[nLen++] = 0x66;
			pStart[nLen++] = 7;     
			pStart[nLen++] = 3;
			pStart[nLen++] = (char)pPac->nSubType; 
			pStart[nLen++] = 0xff;
            bRet = TRUE;  
			break;
		case DKGDATA_REG://单回路灯坑盖数据查询
            pStart[nLen++] = 0x66;
			pStart[nLen++] = 7;     
			pStart[nLen++] = 5;
			pStart[nLen++] = (char)pPac->nSubType; 
			pStart[nLen++] = 0xff;
            bRet = TRUE;  
			break;
		default :
			bRet = FALSE;
			break;
		}
		pStart[nLen++] = CRC_ADD(pStart, 5);
	}
    else //write===============================	
	{	
		switch (pPac->nRegType)
		{
		case MULTISP_REG ://设置多路串口回路数
			{
				pStart[nLen++] = 0x55;
				pStart[nLen++] = 10;      
				pStart[nLen++] = 3;
				for(int i=0; i<5; i++)
				{
					if( i == pIdNo->wNo )
					{
						pStart[nLen++] = pIdNo->plcValue.byteVal;
					}
					else
					{
						pStart[nLen++] = m_nSelectLoopNo[i];
					}
				}
				//pStart[nLen++] = 0xff;
				pStart[nLen++] = CRC_ADD(pStart, 8);
				bRet = TRUE;  
				break;
			}
		case ADAPTER_REG : //设置通讯适配器的回路号
			{
				int nOneNum = 0;
				int nOneVal = 0;

⌨️ 快捷键说明

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