13.11.2 发送数据操作的控制功能(2)
【代码解析】
第4行获取字符串的长度。第5行判断字符串中的字符个数是否为偶数,否则在第7行为字符串尾部添加字符0,并在第8行将字符串长度加1。第10~31行遍历字符串中的每一个字符,并将相邻的两个字符转化为相应的十六进制值。第13行判断当前的字符是否为空字符,如是则在第16行直接跳过。第12行h保存字符串中i位置上的一个字符,而l在第21行保存i+1位置上的字符。然后在第22、23行将字符形式的数值转化成数值(如字符'1'转化成数值1)。第24行判断这两个字符转化后的值是否合法(应该为0~F)。如果合法则在第27行将这两个相邻的字符串合并为一个十六进制值。在第29行将这个十六进制值保存到数组中。
第22、23行调用的HexChar()也是一个自定函数,该函数实现了将数字字符串转化为相应数值的功能,实现如下:
- 01 char CComElvesDlg::HexChar(char c)
- 02 {
- 03 if((c>='0')&&(c<='9')) //0~9
- 04 return c-0x30;
- 05 else if((c>='A')&&(c<='F')) //A~F
- 06 return c-'A'+10;
- 07 else if((c>='a')&&(c<='f')) //a ~f
- 08 return c-'a'+10;
- 09 else
- 10 return 0x10;
- 11 }
(2)手动发送。手动发送实现比较简单,是自动发送的一个操作子集。在发送数据区域有个"发送"按钮,单击该按钮时,将实现手动发送的功能。但是在自动发送时,该按钮变为"停止"按钮。如果此时想实现手动发送功能,就需要先单击"停止"按钮实现停止自动发送,"停止"按钮才能变为"发送"按钮。其实"停止"与"发送"按钮为同一个按钮,只是按钮标题的改变,这在自动发送实现过程中已有体现。因此这两个按钮用相同的处理函数OnSend(),就是在这个函数中既实现停止自动发送的功能,又实现手动发送数据的功能。
- 01 void CComElvesDlg::OnSend()
- 02 {
- 03 if(m_Port.m_hComm==NULL) //判断串口是否已经打开
- 04 {
- 05 AfxMessageBox("串口没有打开,请打开串口");
- 06 return;
- 07 }
- 08 else
- 09 {
- 10 if(m_bAuto) //判断当前是否处于自动发送状态
- 11 {
- 12 m_bAuto = false;
- 13 GetDlgItem(IDC_SEND)->SetWindowText("发送");
- 14 KillTimer(1);
- 15 UpdateData(false);
- 16 return;
- 17 }
- 18 UpdateData(TRUE); //获取发送编辑框中的数据
- 19 SaveSMod();
- 20 if(m_bSHex) //发送数据的格式
- 21 { //十六进制
- 22 char data[512];
- 23 int len=StrToHex(m_sData,data);
- 24 m_Port.WriteToPort(data,len);
- 25 m_SCount+=(long)((m_sData.GetLength()+1)/3);
- 26 }
- 27 else
- 28 { //字符串形式
- 29 m_Port.WriteToPort((LPCTSTR)m_sData); //发送数据
- 30 m_SCount+=m_sData.GetLength();
- 31 }
- 32 CString strTemp;
- 33 strTemp.Format("TX:%d",m_SCount);
- 34 m_ctrlSCount.SetWindowText(strTemp);
- 35 }
- 36 }
【代码解析】
通过观察可以看出手动发送的过程与自动发送极其相似。其实这两者是相同的,只是自动发送添加了一个定时器,多次的调用定时器处理函数重复手动发送的过程。