件 3.利用 ClassWizard 定义 CMSComm 类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数 OnComm() 6.打开和设置串口参数 7.发送数据 8.发送十六进制字符 9.在接收框中以十六进制显示 10.如何设置自动发送 11.什么是 VARIANT 数据类型?如何使用 VARIANT 数据类型?
这是串口调试助手源程序及编程详细过程 (一) 的续篇, 首先谢谢朋友们的支持与鼓励。
8.发送十六进制字符 在主对话框中加入一个复选接钮,ID 为 IDC_CHECK_HEXSEND Caption: 十六进制发 送,再利用 ClassWizard 为其添加控制变量:m_ctrlHexSend;
在 ClassView 中为 SCommTestDlg 类添加以下两个 PUBLIC 成员函数, 并输入相应代码;
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空 隔 //如:A1 23 45 0B 00 29
//CByteArray 是一个动态字节数组,可参看 MSDN 帮助 int CSCommTestDlg::String2Hex(CString str, CByteArray &;senddata) { int hexdata,lowhexdata; int hexdatalen=0; int len=str.GetLength(); senddata.SetSize(len/2); for(int i=0;i
=len) break; lstr=str[i]; hexdata=ConvertHexChar(hstr); lowhexdata=ConvertHexChar(lstr); if((hexdata==16)||(lowhexdata==16)) break; else hexdata=hexdata*16+lowhexdata; i++; senddata[hexdatalen]=(char)hexdata; hexdatalen++; } senddata.SetSize(hexdatalen); return hexdatalen; } //这是一个将字符转换为相应的十六进制值的函数 //好多 C 语言书上都可以找到 //功能:若是在 0-F 之间的字符,则转换为相应的十六进制字符,否则返回-1 char CSCommTestDlg::ConvertHexChar(char ch)
{ if((ch>='0')&;&;(ch<='9')) return ch-0x30; else if((ch>='A')&;&;(ch<='F')) return ch-'A'+10; else if((ch>='a')&;&;(ch<='f')) return ch-'a'+10; else return (-1); }
再将 CSCommTestDlg::OnButtonManualsend()修改成以下形式: void CSCommTestDlg::OnButtonManualsend() { // TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容 if(m_ctrlHexSend.GetCheck()) { CByteArray hexdata; int len=String2Hex(m_strTXData,hexdata); //此处返回的 len 可以用于计算发送了多少个十六 进制数 m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据 } else m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送 ASCII 字符数据 }
现在,你先将串口线接好并打开串口调试助手 V2.1,选上以十六制显示,设置好相应串口, 然后运行我们这个程序,在发送框中输入 00 01 02 03 A1 CC 等十六进制字符,并选上以十 六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到 00 01 02 03 A1 CC 了。
9.在接收框中以十六进制显示 这就容易多了: 在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用 ClassWizard 为其添加控制变量:m_ctrlHexDiaplay。 然后 修改 CSCommTestDlg::OnComm()函数:
void CSCommTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置