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

📄 ca2ipro.cpp

📁 民航二所单片机驱动开发
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				int nOneLen = 0;
				pStart[nLen++] = 0x66;
				pStart[nLen++] = 0X27;//39;      
				pStart[nLen++] = 2;
				pStart[nLen++] = (char)pPac->nSubType;
				pStart[nLen++] = 0;
				for(int i=1; i<33; i++)
				{
					if( i == pIdNo->wNo )
					{						
						pStart[nLen++] = pIdNo->plcValue.byteVal;
						if(pIdNo->plcValue.byteVal>0x01)
						{
							nOneNum++;
							nOneVal = pIdNo->plcValue.byteVal;
						}
					}
					else
					{
						int k = 0;
						k = pPac->nSubType*33+i;
						pStart[nLen++] = m_nHaveSensor[k];
						if(m_nHaveSensor[k]>0x01)
						{
							nOneNum++;
							nOneVal = m_nHaveSensor[k];
						}
					}
				}
				nOneLen = (nOneNum-1)*8 + GetOnePos((BYTE)nOneVal);
				pStart[4] = nOneLen;
				pStart[nLen++] = CRC_ADD(pStart, 37);
				bRet = TRUE;  
				break;
			}
		case TOFF_REG ://关多路串口的自动轮询
			pStart[nLen++] = 0x55;
			pStart[nLen++] = 7;      
			pStart[nLen++] = 5;
			pStart[nLen++] = 0xff;   
			pStart[nLen++] = 0xff;
			pStart[nLen++] = CRC_ADD(pStart, 5);
            bRet = TRUE;  
			break;
		case TON_REG  ://开多路串口的自动轮询
			pStart[nLen++] = 0x55;
			pStart[nLen++] = 7;      
			//pStart[nLen++] = 6;
			if(pIdNo->plcValue.bitVal)
				pStart[nLen++] = 6;
			else
				pStart[nLen++] = 5;
			pStart[nLen++] = 0xff;   
			pStart[nLen++] = 0xff;
			pStart[nLen++] = CRC_ADD(pStart, 5);
            bRet = TRUE;  
			break;
		default :
			bRet = FALSE;
			break;
		}
	}  //end of Process Write Proc   
	if (bRet)
	{
	   pStart[nLen++] = 0x68;
	}
	else
	   nLen = 0; 
	return bRet;
}

BOOL CCA2IPro::Transmission(BYTE *buf, int &nLen, int nReceLen,PPACKET pPac/*, int SleepTime*/)  
{ 
	DWORD   dwError = 0;
	COMSTAT	cs;
	ULONG   nByteRead = 0, nSend = 0;
	if (!WriteFile(m_hComm, buf, nLen, &nSend, NULL))
	{
		dwError = GetLastError();
#ifdef OUT_DEBUG_MESSAGE
        ShowMessage("发送数据失败");  
#endif
		return  FALSE;
	}

#ifdef OUT_DEBUG_MESSAGE
	char strDisp[5000];
	int j = 0;
	memset(strDisp, 0, sizeof(strDisp));
	strcpy(strDisp, "发送:");
	for (j = 0; j < (int)nSend; j++)
	{
		itoa((BYTE)buf[j], strDisp+strlen(strDisp), 16); 
		strcat(strDisp + strlen(strDisp), " ");
	}
    ShowMessage(strDisp);
#endif
	//LIJIANHONG 2002-7-28
	if(buf[0] == 0xdd || buf[0] == 0xd0)
		return TRUE;
	Sleep(1200);
	int nTime = 0;
	
	//ljh delete 20030508
/*	if(pPac != NULL)
	{
		//if(m_nMaxNo[pPac->nSubType] == 0)
		//	goto SLEEP_TIME;
#ifdef OUT_DEBUG_MESSAGE
		char buf[128];
		memset(buf, 0, sizeof(buf));
		sprintf(buf, "延时处理:回路号-%d, 子站长度-%d", pPac->nSubType, m_nHaveSensor[pPac->nSubType*33]);
		ShowMessage(buf);
#endif
		switch(pPac->nRegType)
		{//延时处理
		case MSPDATA_REG:
			{
				///int nTime = (m_nSleepTime[SleepTime]+1)*1000;
				m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]*3*0.04)+1.08)+5+10;
				///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]*3*0.04)+1.08)+5;
				nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
				break;
			}
		case SENDATA_REG:
			{
				m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]*3*0.04)+1.08)+5+10;
				///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]*3*0.04)+1.08)+5;
				nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
				break;
			}
		case DKSDATA_REG:
			{
				m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]+18)*3*0.02)+5;
				///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]+18)*3*0.02)+5;
				nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
				break;
			}
		}
//SLEEP_TIME:
		//Sleep(20000);
	}
	//Sleep(nTime);
	//LIJIANHONG 2002-7-28
*/ 
	//ljh delete 20030508
	DWORD  dwTimeOut = 0;
	if(pPac != NULL)
	{
		if(pPac->nRegType == MSPDATA_REG ||
		   pPac->nRegType == SENDATA_REG ||
		   pPac->nRegType == DKSDATA_REG ||
		   pPac->nRegType == DKGDATA_REG )
		{
			dwTimeOut = GetTickCount() + 110*1000;//等待110秒 ljh modify 20030508
		}
		else
		{
			dwTimeOut = GetTickCount() + m_nTimeOut;
		}
	}
    BYTE   pData[1024];
    nLen = 0;
    while (TRUE)
	{
        if (GetTickCount() > dwTimeOut)
	    {
#ifdef OUT_DEBUG_MESSAGE
            ShowMessage("接收超时!");
#endif
			return FALSE;
	    }
        ClearCommError(m_hComm, &dwError, &cs);
        if (cs.cbInQue)
	    {
			if(cs.cbInQue >= 1023)
				cs.cbInQue = 1024;
            memset(pData, 0, sizeof(pData));
			if (!ReadFile(m_hComm, pData, cs.cbInQue, &nByteRead, NULL))
			{
#ifdef OUT_DEBUG_MESSAGE
    	        ShowMessage("接收数据失败");  
#endif
				return FALSE;
	        }
			if((nLen+nByteRead)>=1024)
			{
#ifdef OUT_DEBUG_MESSAGE
    	        ShowMessage("接收数据长度大于1024!");  
#endif
				return FALSE;
			}
			memcpy(buf+nLen, pData, nByteRead);
            nLen += nByteRead;
			if(pPac->nRegType == MULTISP_REG && pPac->nPacketType == PT_WRITE)
			{
				if ((nLen > 10 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
				{
					break;
				}
			}
			else if(pPac->nRegType == ADAPTER_REG && pPac->nPacketType == PT_WRITE)
			{
				if ((nLen > 39 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
				{
					break;
				}
			}
			else
			{
 				if ((nLen > 7 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
				{
					break;
				}
			}
	    }	        
		Sleep(WAIT_INTERVAL);
	}

#ifdef OUT_DEBUG_MESSAGE
	memset(strDisp, 0, sizeof(strDisp));
	strcpy(strDisp, " 接收:");
	for (j=0; j<nLen; j++)
	{
		itoa((BYTE)buf[j], strDisp+strlen(strDisp), 16); 
		strcat(strDisp + strlen(strDisp), " ");
	}
    ShowMessage(strDisp);
#endif
	
	return TRUE;   //not verified Data validate --left it to corresponding Block PROC
}

void ShowMessage( const char* msg)  
{
	 ATOM msgAtom;
     HWND hMessWnd = ::FindWindow( "kingmess", NULL);
	 if( hMessWnd)
	 {
		 unsigned short u_count = 0;
		 unsigned short out_len = 126;
		 char szMess[128];
		 memset(szMess, 0, sizeof(szMess));
		 
		 u_count = strlen(msg);
		 if(u_count)
		 {			 
			 u_count = (u_count%out_len)?(u_count/out_len):(u_count/out_len-1);
			 for(int i=0; i<=u_count; i++)
			 {
				 memset(szMess, 0, sizeof(szMess));
				 strcpy(szMess," ");
				 strncpy( szMess+strlen(szMess), msg+i*out_len, min(out_len,strlen(msg+i*out_len)) );
				 szMess[out_len+1] = 0;
				 msgAtom = GlobalAddAtom( szMess );
				 ASSERT( msgAtom );
				 ::SendMessage( hMessWnd, WM_MESSAGE_OUTPUT, (WPARAM)msgAtom, 0 );
				 GlobalDeleteAtom( msgAtom );
			 }
		 }
	 }
}
/*
void  ShowMessage(const char *msg)  // 显示通信信息
{
     HWND hMessWnd = ::FindWindow( "kingmess", NULL);
     char szMess[256];
	 memset(szMess, 0, sizeof(szMess));
     ATOM messAtom;
	 if (hMessWnd)
	 {
         strncpy(szMess, msg, min(255, strlen(msg)));              
		 szMess[255] = 0;
         messAtom = GlobalAddAtom(szMess);
		 //ASSERT(messAtom);
		 unsigned long messId = WM_MESSAGE_OUTPUT;
		 ::SendMessage(hMessWnd, WM_MESSAGE_OUTPUT, (WPARAM)messAtom, 0);
		 GlobalDeleteAtom(messAtom);
	 }
}
*/
BOOL CCA2IPro::InitLoopNoAndNum()
{
/*	for(int j=1; j<=32; j++)
	{
		if(j%2 == 0)
		{
			LoopNum[j] = 1;
		}
		else
		{
			LoopNum[j] = 1;
		}
	}

*/	BOOL bSuc = FALSE;
	int nLoopNum = 0;
	BYTE Loop1 = 0;
	BYTE Loop2 = 0;
	BYTE Loop3 = 0;
	BYTE Loop4 = 0;
	
	Loop1 = GetByte(LoopNum+1);
	Loop2 = GetByte(LoopNum+9);
	Loop3 = GetByte(LoopNum+17);
	Loop4 = GetByte(LoopNum+25);
	
	for(int i=1; i<=32; i++)
	{
		if(LoopNum[i] == 1)
			nLoopNum++;
	}
	m_nSelectLoopNo[0] = nLoopNum;
	m_nSelectLoopNo[1] = Loop1;
	m_nSelectLoopNo[2] = Loop2;
	m_nSelectLoopNo[3] = Loop3;
	m_nSelectLoopNo[4] = Loop4;

	BYTE buf[2048];
	int nLen = 0;

	memset(buf, 0, sizeof(buf));
	buf[nLen++] = 0x55;
	buf[nLen++] = 10;      
	buf[nLen++] = 3;
	for(int k=0; k<5; k++)
	{
		buf[nLen++] = m_nSelectLoopNo[k];
	}
	//buf[nLen++] = 0xff;
	buf[nLen++] = CRC_ADD(buf, 8);
	buf[nLen++] = 0x68;
	
	int nReceLen = 0;
	
	if (!Transmission(buf, nLen, nReceLen,NULL))
	{
		bSuc = FALSE;
	}
	BYTE CheckBuf[1024];
	memset(CheckBuf, 0, sizeof(CheckBuf));
	if(buf[0] != 0xdd)
	{
		CheckBuf[0] = 0xd0;  CheckBuf[1] = 0xd0;  CheckBuf[2] = 0xd0; 
		bSuc = FALSE;
#ifdef OUT_DEBUG_MESSAGE
		ShowMessage("设置多路串口回路数失败");
#endif	
	}
	else
	{
		CheckBuf[0] = 0xdd;  CheckBuf[1] = 0xdd;  CheckBuf[2] = 0xdd; 
		bSuc = TRUE;  
#ifdef OUT_DEBUG_MESSAGE
		ShowMessage("设置多路串口回路数成功");
#endif	
	}
	
	nLen = 3;
	Transmission(CheckBuf, nLen, nLen,NULL);

	return bSuc;
}

BYTE CCA2IPro::GetByte(BYTE *Val)
{
	int	nByteVal = 0;
	for(int i=0; i<8; i++)
	{
		if(Val[i] == 1)
		{
			nByteVal += (BYTE)pow(2,(7-i));
		}
	}
	return nByteVal;
}

void CCA2IPro::SetLoopNum(BYTE *pData)
{
/*	pData[0] = 0x88;
	pData[1] = 0x44;
	pData[2] = 0x22;
	pData[3] = 0x11;
*/
	BYTE nConVal = 0;
	BYTE nTemp = 0;
	nConVal = pData[0];
	for(int i=0; i<4; i++)
	{
		nConVal = pData[i];
		for(int k=1; k<=8; k++)
		{
			nTemp = (BYTE)pow(2,(8-k));
			if( (nConVal&nTemp) == nTemp )
			{
				LoopNum[i*8+k] = 1;
			}
			else
			{
				LoopNum[i*8+k] = 0;
			}
		}
	}
}

BYTE CCA2IPro::GetData(char *pBuf, int nNo, int nRegType, int nLen)
{
	BYTE bVal = 0;
	//int strLen = strlen(pBuf);
	int strLen = nLen;

#ifdef OUT_DEBUG_MESSAGE
		char buf[128];
		//memset(buf, 0, sizeof(buf));
		//sprintf(buf, "数据长度=%d, 数据序号=%d.", nLen, nNo);
		//ShowMessage(buf);
		memset(buf, 0, sizeof(buf));
		sprintf(buf, "数据长度=%d, 数据序号=%d.", strLen, nNo);
		ShowMessage(buf);
#endif

	if(strLen == 0 || nNo < 1)
	{
#ifdef OUT_DEBUG_MESSAGE
		memset(buf, 0, sizeof(buf));
		ShowMessage("在解析数据时发现数据长度错误");  
#endif
		return 0;
	}
	WORD wData = 0;
	char pData[1024];
	memset(pData, 0, sizeof(pData));
	//strcpy(pData, pBuf);
	memcpy(pData, pBuf, strLen);
	char pStr[2];
	pStr[0] = pData[(nNo-1)*2+1];
	pStr[1] = pData[(nNo-1)*2];
	memcpy(&wData, pStr, 2);			
	
	for(int i=0; i<8; i++)
	{
		int nPow = 0;
		switch(nRegType)
		{
		case MSPDATA_REG:
			{
				nPow = (int)pow(2, (15-2*i));
				break;
			}
		case SENDATA_REG:
			{
				nPow = (int)pow(2, (15-2*i-1));
				break;
			}
		default:
			{
#ifdef OUT_DEBUG_MESSAGE
				ShowMessage("在解析数据时发现寄存器类型错误");  
#endif
				return 0;
			}
		}
		if( (wData&nPow) )
		{
			bVal = bVal + (BYTE)pow(2, (7-i));
		}
	}
	return bVal;
}

BYTE CCA2IPro::GetOnePos(BYTE bVal)
{
	BYTE nRet = 0;
	BYTE nAndVal = 0;
	for(int i=0; i<8; i++)
	{
		nAndVal = (BYTE)pow(2, i);
		if( (nAndVal&bVal) == nAndVal)
		{
			nRet = 8-i;
			break;
		}
	}
	return nRet;
}

⌨️ 快捷键说明

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