数据发送过程分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/79293188

发送的原理
1. 将每个控件的数据保存到一个数组中
2. 将每组控件的数据组合到一起放入AT命令栏中整合成一条AT命令
3. 逐条发送每个AT命令

// Write 菜单项消息处理函数
void CIntegrityMobileConfiguratorDlg::OnDeviceWrite()
{
    // TODO: 在此添加命令处理程序代码
    if(!m_bSerialConnected)
    {
        AfxMessageBox("The connect button not pressed!");
        return;
    }
    SendAllCmd(TRUE);        
}
//逐条发送AT命令
void CIntegrityMobileConfiguratorDlg::SendAllCmd(BOOL isFirst)
{
      OnGtdevSend();
      Sleep (50) ; //保证发送的可靠性,发完每条命令后延时
      OnGtbsiSend();
      Sleep (50) ;      
      OnGtsriSend();           
      Sleep (50) ;
      OnGtcfgSend();
      Sleep (50) ;
      OnGtwslSend();
      Sleep (50) ;
      OnGtwltSend();
      Sleep (50) ;
      OnGtfriSend();
      Sleep (50) ;
      OnGtagpSend();
      Sleep (50) ;
      OnGtnmdSend();
      Sleep (50) ;
}
//获取组合好的AT命令
void CIntegrityMobileConfiguratorDlg::OnGtdevSend()
{
    CString strSend;
    page1.GetDlgItemText(IDC_EDIT_GTDEV,strSend);
    m_pcfgProcess->CfgSend(strSend.GetBuffer(0),TRUE);
}
//发送数据
void CfgProcess::CfgSend(char *data, BOOL ackCheck)
{
    sendData(data);   
}
void sendData(char *data)
{
   ((CIntegrityMobileConfiguratorDlg*)AfxGetMainWnd())->SerialSend(data,strlen(data));
}
void CIntegrityMobileConfiguratorDlg::SerialSend(char *data, int len)
{
    if(!m_bSerialConnected)
    {
        AfxMessageBox("The connect button not pressed!");
        return;
    }
    CString datanew;
    datanew=CString(data).Left(len)+"\r\n";
    DWORD wCount = 0;
    WriteFile(m_hCom, datanew, datanew.GetLength(), &wCount, NULL);//最终发送数据的函数
}

OnGtdevSend 函数中的IDC_EDIT_GTDEV 这个控件的内容是由下面
SetDlgItemText(IDC_EDIT_GTDEV,m_pcfgProcess->CfgMakeGtdev(strCfgPara1));得到的
CfgMakeGtdev相关代码如下:

CString CfgProcess::CfgMakeGtdev(char cmdPara[][MAX_CMD_PARA_LEN])
{
    CString strCmd;
    strCmd.Format("%s%s%c%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%04X%c",
        CFG_CMD_TOKEN,
        CFG_CMD_GTDEV,
        CFG_CUSTOM_EQUAL,
        INIT_PSW,
        cmdPara[41],
        cmdPara[42],
        cmdPara[43],
        cmdPara[44],
        cmdPara[45],
        cmdPara[46],
        cmdPara[47],
        cmdPara[48],
        cmdPara[49],
        cmdPara[50],
        cmdPara[51],
        cmdPara[52],
        cmdPara[53],
        cmdPara[54],
        cmdPara[55],
        cmdPara[56],
        0x0021,
        CFG_END_SYMBOL);

    return strCmd;
}

在 CfgMakeGtdev()函数中,各组数据由cmdPara[41]~到cmdPara[56],相关代码如下

void CIntegrityMobileConfiguratorDlg::GetPage1Para(char cmdPara[][MAX_CMD_PARA_LEN]) 
{
    GetDlgItemText(IDC_EDIT_DEVICE1_ADDRESS,cmdPara[0],MAX_CMD_PARA_LEN); //将控件的文本复制到数组中
    sprintf(cmdPara[1],"%d",((CComboBox*)GetDlgItem(IDC_COMBO_DEVICE1_ADDRESS))->GetCurSel()); //将组合框的当前选中选项复制到数组
    GetDlgItemText(IDC_EDIT_DEVICE2_ADDRESS,cmdPara[2],MAX_CMD_PARA_LEN);
    sprintf(cmdPara[3],"%d",((CComboBox*)GetDlgItem(IDC_COMBO_DEVICE2_ADDRESS))->GetCurSel());
    GetDlgItemText(IDC_EDIT_DEVICE3_ADDRESS,cmdPara[4],MAX_CMD_PARA_LEN);
    sprintf(cmdPara[5],"%d",((CComboBox*)GetDlgItem(IDC_COMBO_DEVICE3_ADDRESS))->GetCurSel());
    GetDlgItemText(IDC_EDIT_DEVICE4_ADDRESS,cmdPara[6],MAX_CMD_PARA_LEN);
    sprintf(cmdPara[7],"%d",((CComboBox*)GetDlgItem(IDC_COMBO_DEVICE4_ADDRESS))->GetCurSel());
    //余下省略……

    memcpy(strCmdPara_mda,cmdPara, MAX_CMD_PARA_NUM*MAX_CMD_PARA_LEN);  //将当前所有控件的的数据复制给strCmdPara_mda,一旦控件状态改变后,已备下次判断前一次状态!        
    Mosaic(cmdPara);
}
//将GTDEV中每一组mode与Address拼接在一起
void CIntegrityMobileConfiguratorDlg::Mosaic(char cmdPara[][MAX_CMD_PARA_LEN]) 
{
    int i=0,j=1,k=41,X;
    for(;i<31;i+=2,j+=2,k+=1)
    {
    CString Address(cmdPara[i]);
    CString Dui(cmdPara[j]);
    CString Add(cmdPara[k]);
    X = atoi(cmdPara[j]);
    switch(X)
        {               
        case 0:
            Dui = "10";
            break;
        case 1:
            Dui = "11";
            break;
        case 2:
            Dui = "12";
            break;
        case 3:
            Dui = "13";
            break;
        case 4:
            Dui = "14";
            break;
        case 5:
            Dui = "20";
            break;
        case 6:
            Dui = "21";
            break;
        case 7:
            Dui = "22";
            break;
        case 8:
            Dui = "30";
            break;
        case 9:
            Dui = "31";
            break;
        case 10:
            Dui = "32";
            break;
    } 
    if((strlen(Address))>0)
        {
            Add = Dui + Address;
            strcpy(cmdPara[k], Add.GetBuffer(0));        
        }
    else
        {
            Add = Address;      //当Address为空时,不将Dui与Address拼接在一起显示,只将Address的空值显示到底部的边框内
            strcpy(cmdPara[k], Add.GetBuffer(0));            
        }
    }    
}

第一个页面与第二个页面的数据处理不太一样,第一页面中需要将每行的前两个数据(Address与Dui)拼接在一起作为一组数据,然后将每组数据在下方AT命令编辑框中组合在一起。第二页中是直接按照类别将各个控件的数据组合到下方的AT命令编辑框中。
例如第二页GTSRI,直接获取每个空间的数据到数组,然后显示到下方的AT命令栏中

void CIntegrityMobileConfiguratorDlg::SetGtsriPara(char cmdPara[][MAX_CMD_PARA_LEN]) 
{
    page2.SetDlgItemText(IDC_EDIT_BACKEND_SERVER1,cmdPara[3]);
    page2.SetDlgItemText(IDC_EDIT_SERVER_PORT1,cmdPara[4]);
    page2.SetDlgItemText(IDC_EDIT_BACKEND_SERVER2,cmdPara[5]);
    page2.SetDlgItemText(IDC_EDIT_SERVER_PORT2,cmdPara[6]);
    page2.SetDlgItemText(IDC_EDIT_SMS_NUMBER_ALERT,cmdPara[7]);    
}
CString CfgProcess::CfgMakeGtsri(char cmdPara[][MAX_CMD_PARA_LEN])
{
    CString strCmd;
    strCmd.Format("%s%s%c%s,%s,,,%s,%s,%s,%s,%s,,,,,,,%04X%c",
        CFG_CMD_TOKEN,
        CFG_CMD_GTSRI,
        CFG_CUSTOM_EQUAL,
        INIT_PSW,
        THREE,      //report mode
        cmdPara[4], //Backend Server1
        cmdPara[5], //Server port1
        cmdPara[6], //Backend Server2
        cmdPara[7], //Server port2
        cmdPara[10],//SMS Number        
        0x0003,
        CFG_END_SYMBOL);
    return strCmd;
}

猜你喜欢

转载自blog.csdn.net/qq_17017545/article/details/79293188
今日推荐