数据发送过程分析
2018-02-08 20:59
344 查看
发送的原理:
1. 将每个控件的数据保存到一个数组中
2. 将每组控件的数据组合到一起放入AT命令栏中整合成一条AT命令
3. 逐条发送每个AT命令
OnGtdevSend 函数中的
在 CfgMakeGtdev()函数中,各组数据由cmdPara[41]~到cmdPara[56],相关代码如下
第一个页面与第二个页面的数据处理不太一样,第一页面中需要将每行的前两个数据(Address与Dui)拼接在一起作为一组数据,然后将每组数据在下方AT命令编辑框中组合在一起。第二页中是直接按照类别将各个控件的数据组合到下方的AT命令编辑框中。
例如第二页GTSRI,直接获取每个空间的数据到数组,然后显示到下方的AT命令栏中
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; }
相关文章推荐
- Android IPC数据在内核空间中的发送过程分析
- Android IPC数据在内核空间中的发送过程分析
- openWrt: 数据发送过程分析
- 【Netty源码分析】发送数据过程
- 【Netty源码分析】发送数据过程
- 【Netty源码分析】发送数据过程
- Android IPC数据在内核空间中的发送过程分析
- Android应用程序发送广播(sendBroadcast)的过程分析
- HDFS读文件过程分析:读取文件的Block数据
- 【Netty源码分析】数据读取过程
- 安卓向服务器发送数据和服务器接收数据全过程
- Nginx upstream原理分析【1】给后端FastCGI发送数据
- 嵌入式 vlc从接收到数据流到播放视频的过程分析
- ME310之AT指令总结:发送[文本|PDU],[普通|飞信]短信,发送GPRS数据,读取短信分析
- vlc从接收到数据流到播放视频的过程分析
- 关于Ext3.0中按条件查询并重新加载Grid中的数据的实现过程及store.load的分析
- Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
- 论如何是用RTP打包H264数据(发送分包发送分析)
- HDFS的写数据过程分析