版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}