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

📄 dtedlg.cpp

📁 自己项目组开发的自组网传输中串口通信程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{
	
	EnterCriticalSection(&m_csLock);
	if(m_CanDeal)
	{
		DealDataFromPRU(Protoal);
		m_recvedit.SetWindowText(aStr);
		m_CanDeal = FALSE ;
	}
	LeaveCriticalSection(&m_csLock);	
//	UpdateData(FALSE);
	CDialog::OnTimer(nIDEvent);
}
//----------------------------------------------------------------------
//查询本节点的等待发送的分组个数
//数据格式:0x11 0x00
//------------------------------------------------------------------------
void CDTEDlg::OnPktnum() 
{
	 UINT16 iLen = 0;
     unsigned char *Temp = NULL;
     Query_OutData DTEQueryData;

	 DTEQueryData.Command = PhyWaitSendPktNum;
     DTEQueryData.CommandAdd = 0x00;
     Temp = (unsigned char *)(&DTEQueryData);
     iLen = 2;
	 SerialWriteData(m_hCommPort, Temp, iLen);	
}
//--------------------------------------------------------------------
//查询本节点的最大传输单元
//数据格式:0x10 0x00
//---------------------------------------------------------------------
void CDTEDlg::OnMtu() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    Query_OutData DTEQueryData;

	DTEQueryData.Command = ReturnMTU;
    DTEQueryData.CommandAdd = 0x00;
    Temp = (unsigned char *)(&DTEQueryData);
    iLen = 2;
	SerialWriteData(m_hCommPort, Temp, iLen);		
}
//--------------------------------------------------------------------
// 查询本节点路由信息
//数据格式:0x06	0x00
//-----------------------------------------------------------------------
void CDTEDlg::OnRoute() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    Query_OutData DTEQueryData;

	DTEQueryData.Command = ParaLocalNodeRouteTable;
    DTEQueryData.CommandAdd = 0x00;
    Temp = (unsigned char *)(&DTEQueryData);
    iLen = 2;
	SerialWriteData(m_hCommPort, Temp, iLen);		
}
//-------------------------------------------------------------------
//查询本节点有效IP地址
//数据格式:0x0d	0x00
//--------------------------------------------------------------------

void CDTEDlg::OnEffecip() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    Query_OutData DTEQueryData;

	DTEQueryData.Command = QueryLocalNodeList;
    DTEQueryData.CommandAdd = 0x00;
    Temp = (unsigned char *)(&DTEQueryData);
    iLen = 2;
	SerialWriteData(m_hCommPort, Temp, iLen);	
	
}
//------------------------------------------------------
//主动发起路由
//数据格式0x71	0x00
//------------------------------------------------------
void CDTEDlg::OnTakeroute() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    SendRoute_OutStruct SendRoute;

    SendRoute.Command = SendRouteADV ;
    SendRoute.AutoRoute = 0x00;      
    Temp = (unsigned char *)(&SendRoute);
    iLen = 2;	
	SerialWriteData(m_hCommPort, Temp, iLen);
}
//------------------------------------------------------
//主动退网注销
//数据格式 0x72	0x00
//-------------------------------------------------------
void CDTEDlg::OnExitroute() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;        
    SendExit_OutStruct  SendExit;

    SendExit.Command = Logout ;
    SendExit.AutoExit = 0x00;
    Temp = (unsigned char *)(&SendExit);
    iLen = 2;
	SerialWriteData(m_hCommPort, Temp, iLen);	
}
//--------------------------------------------------------
//调试信息开
//数据格式 0x73 0x01 0x01
//-----------------------------------------------------------
void CDTEDlg::OnDebugopen() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    DTE_OutData DTEOutData;

    DTEOutData.Command = CloseDebugInfo;
    DTEOutData.Length = 0x01;
    DTEOutData.Data.SendDebugOpen.Debug = 0x01;
    Temp = (unsigned char *)(&DTEOutData);
    iLen = 3;
	SerialWriteData(m_hCommPort, Temp, iLen);
	//菜单复选标志
	m_isDebug = 0?1:0;	
}

void CDTEDlg::OnUpdateDebugopen(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(1);
}
//-----------------------------------------------------------------
//调试信息关
//数据格式 0x73 0x01 0x00
//----------------------------------------------------------------
void CDTEDlg::OnDebugoff() 
{
	UINT16 iLen = 0;
    unsigned char *Temp = NULL;
    DTE_OutData DTEOutData;

    DTEOutData.Command = CloseDebugInfo;
    DTEOutData.Length = 0x01;
    DTEOutData.Data.SendDebugOpen.Debug = 0x00;
    Temp = (unsigned char *)(&DTEOutData);
    iLen = 3;
	SerialWriteData(m_hCommPort, Temp, iLen);
	//菜单复选标志
	m_isDebug = 0?1:0;	
	
}

void CDTEDlg::OnUpdateDebugoff(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_isDebug);
}
//------------------------------------------------------------------------
//发送分组数据包
//
//---------------------------------------------------------------------
void CDTEDlg::OnSendbutton() 
{
	UINT16 iLen = 0;
    UINT16 Datalength = 0;
    unsigned char *Temp = NULL;
    int i;
    DWORD IP = 0;
    time_t timer;
    struct tm *tblock;
    IPData_OutStruct   DTEIPData;

   DTEIPData.IpVersion = IPVer;
   switch(m_pricombo.GetCurSel())
   {
        case 0:DTEIPData.PktServiceType =  CommLevel;
                break;
        case 1: DTEIPData.PktServiceType = FirstLevel;
                break;
        case 2: DTEIPData.PktServiceType = UrgencyLevel;
                break;
   }
   DTEIPData.PktAppID0 = (PacketID & 0xff00)>>8;
   DTEIPData.PktAppID1 = PacketID & 0xff;
   PacketID++;
   DTEIPData.PktAppID2 = 0x00;
   DTEIPData.PktAppID3 = 0x00;
   DTEIPData.TTL = PktTTL;
   DTEIPData.ProtocolType = Protype;
   DTEIPData.Checksum0 = Checksum;
   DTEIPData.Checksum1 = Checksum;
   /* 源地址*/
   if(!memcmp(&OwnUserCode, &IP, 4))
   {
	   AfxMessageBox("本机IP地址不正确!请重新设置");
	   return;
   }
   memcpy(&DTEIPData.Src, &OwnUserCode, 4);
    /*目的IP地址*/
   m_IPADDRESS.GetAddress(IP);
   DTEIPData.Dst[0] = (IP&0xff000000)>>24;
   DTEIPData.Dst[1] = (IP&0x00ff0000)>>16;
   DTEIPData.Dst[2] = (IP&0x0000ff00)>>8;
   DTEIPData.Dst[3] = (IP&0x000000ff);
   /*保密标志*/
   for(i=0;i<5;i++)
   DTEIPData.Privacy[i] = 0x00;
   //获取数据长度
   CString strText;
   m_pktedit.GetWindowText(strText);
   Datalength = strText.GetLength();
     //954 = 1024 -70 yuqi2004_415
   if(Datalength >954)
   {
      AfxMessageBox("数据超长!");
   }

   else
   {           /*数据*/
      memset(&DTEIPData.Data, 0, sizeof(DTEIPData.Data));
	  LPTSTR temp = strText.GetBuffer(Datalength);
	  memcpy(&DTEIPData.Data, temp, Datalength);
	  strText.ReleaseBuffer();
      DTEIPData.len0 = ((Datalength + 20 + 5 +2)&0xff00)>>8;  //数据+头长度+保密标识+时间
      DTEIPData.Len = (Datalength + 27)& 0xff;
      /*获取时间*/
      /* gets time of day */
      timer = time(NULL);
      tblock = localtime(&timer);
      if(tblock->tm_hour > 12)
      tblock->tm_hour =  tblock->tm_hour - 12;

      DTEIPData.Data[Datalength] =  ((((UINT8)(tblock->tm_hour))<< 4)&0xf0)|
                                        ((((UINT8)(tblock->tm_min)) >>2)&0x0f);
      DTEIPData.Data[Datalength + 1] =  ((((UINT8)(tblock->tm_min))<<6)&0xc0)|
                                        ((((UINT8)(tblock->tm_sec)))&0x3f);


      Temp = (unsigned char *)(&DTEIPData);
      iLen = Datalength + 27;
	  SerialWriteData(m_hCommPort, Temp, iLen);
	}	
}
//-----------------------------------------------------------------------------
//解析收到的报文
//
//--------------------------------------------------------------------------------
void CDTEDlg::DealDataFromPRU(unsigned char *PRUToDTEbuffer)
{
        UINT8 PktType;
        UINT8 temp;
        UINT8 IPTemp[4];
        UINT16 i, j, m;
        UINT16 index = 0;
        UINT16 Length = 0;
        time_t timer;
        struct tm *tblock;
        char string1[7000], string2[7000], string3[5], LocalIP[20];
        TopoofLocalNode_InStruct LocalNodeRoute;
        UINT8 hour, minute, second;
		CString STemp;


		STemp = _T("");
        PktType = PRUToDTEbuffer[index];
        //是否IP数据报?
        if((PktType>=0x45)&&(PktType<=0x4F))
        {
            index += 2;  //指向IP数据包长度
            //ip数据包的长度
            //ycx_20050331/Length = ((UINT16)PRUToDTEbuffer[index]<<8) + (UINT16)PRUToDTEbuffer[index+1];
            Length = ((UINT8)PRUToDTEbuffer[index]<<8) + (UINT8)PRUToDTEbuffer[index+1];
            index += 10; //指向源IP地址的位置
			aStr += "-------------------------------------------------------------------------------" ;
			aStr += "\r\n";
            for(i=0;i<4;i++)
            IPTemp[i] = (UINT8)PRUToDTEbuffer[index+i];
			STemp.Format("源IP地址是: %d.%d.%d.%d", (UINT8)IPTemp[0], (UINT8)IPTemp[1], (UINT8)IPTemp[2], (UINT8)IPTemp[3]);
			aStr += STemp;
			aStr += "\r\n";
            m = ((UINT16)PRUToDTEbuffer[4]<<8) + (UINT16)PRUToDTEbuffer[5];
			STemp.Format("分组ID: %d", m);
			aStr += STemp;
			aStr += "\r\n";
            index += 13  ;//指向数据的位置
            //将数据打出来
           for(i=0;i<(Length-27);i++)
           string1[i] = (UINT8)(PRUToDTEbuffer[index+i]);
           string1[i] = '\0';
		   aStr += "发送的数据内容:";
           aStr += string1;
		   aStr += "\r\n";
           //发送数据的时间
           index += Length-27;
           //小时
           hour = (UINT8)(PRUToDTEbuffer[index]>>4)&0x0f;
           /*获取时间*/
           /* gets time of day */
           timer = time(NULL);
           tblock = localtime(&timer);
           if(tblock->tm_hour > 12)
           hour += 12;
           //分钟
           minute = (((UINT8)PRUToDTEbuffer[index]& 0x0f)<< 2)|\
                        (((UINT8)PRUToDTEbuffer[index+1]&0xc0)>>6 );
           //秒
           second = (UINT8)(PRUToDTEbuffer[index+1]&0x3f);
		   STemp.Format("发送数据时间: %d:%d:%d", hour, minute, second);
		   aStr += STemp;
		   aStr += "\r\n";
        }
        else
        {
                switch(PktType)
                {       //得到本节点的ID
                       case ParaUserID:
                                index += 2;
                                aStr += "-------------------------------------------------------------------------------";
								aStr += "\r\n";
                                STemp.Format("本节点地址为:  %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
                                                                                               (UINT8)PRUToDTEbuffer[index+1],\
                                                                                               (UINT8)PRUToDTEbuffer[index+2],\
                                                                                               (UINT8)PRUToDTEbuffer[index+3]);
								aStr += STemp;
								aStr += "\r\n";
                      break;
                        //得到本机预置的有效节点地址
                     case ParaNetActiveNode:
                                index += 2;
                                aStr += "-------------------------------------------------------------------------------" ;
								aStr += "\r\n";
                                temp =  PRUToDTEbuffer[index]; //节点的个数
                                index++;
                                for(i=0;i<temp;i++)
                                {
                                        STemp.Format("预置的节点地址为:  %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
                                                                                               (UINT8)PRUToDTEbuffer[index+1],\
                                                                                               (UINT8)PRUToDTEbuffer[index+2],\
                                                                                               (UINT8)PRUToDTEbuffer[index+3]);
                                         index += 4;
                                }
								aStr += STemp;
								aStr += "\r\n";
                  break;
                  //查询有效的节点地址列表
                  case QueryLocalNodeList:
                                aStr += "-------------------------------------------------------------------------------";
								aStr += "\r\n";
                                index += 2;
                                temp =  PRUToDTEbuffer[index]; //节点的个数
                                //yuqi20050419 打印有效节点个数
                                STemp.Format("有效节点个数是: %d", temp);
								aStr += STemp;
								aStr += "\r\n";
                                index++;
                                for(i=0;i<temp;i++)
                                {
                                        STemp.Format("已入网节点地址为:  %d.%d.%d.%d", (UINT8)PRUToDTEbuffer[index],\
                                                                                               (UINT8)PRUToDTEbuffer[index+1],\
                                                                                               (UINT8)PRUToDTEbuffer[index+2],\
                                                                                               (UINT8)PRUToDTEbuffer[index+3]);
										aStr += STemp;
										aStr += "\r\n";
                                         index += 4;

⌨️ 快捷键说明

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