您的位置:首页 > 其它

数据发送过程分析

2018-02-08 20:59 344 查看
发送的原理

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: