嗅探程序详细实现
在(一)的基础上,首先要完成的是对两个串口的初始化:
要用到的是CSerialPort中的成员函数:
(在编译中发现,这一版的CSerialPort有一个问题,就是工程必须采用“使用多字节字符集”的设置,如果使用Unicode会出现类似以下链接描述的编译错误)
BOOL CSerialPort::InitPort(
CWnd* pPortOwner, // 串口拥有者(窗口)
UINT portnr, // 串口号,设备管理器写几就是几
UINT baud, // 波特率
char parity, // 校验位
UINT databits, // 数据位
UINT stopbits, // 停止位
DWORD dwCommEvents, // 这个暂时不明白是什么
UINT writebuffersize) // 写入缓冲区大小
(本项目当中被控硬件的默认通信格式是8位数据位,无校验位,1停止位,波特率38400)
参数下拉菜单
那么在对话框当中要设置相应的下拉菜单列表,选择相应的参数。
拖拽工具箱中的Combo Box到已有的对话框当中。关于对Combo Box的设置参照[1]
这一步完成后,程序的界面如下图所示:
Combo Box 的字符串批量添加中用到了“字符串数组”,即将多个字符串存进一个二维数组当中然后再通过循环赋值对 ComboBox 进行初始化,这是“字符串数组”初始化的具体做法
而为了让代码简洁,编写了Combo Box的初始化函数,以初始化虚拟串口的波特率下拉菜单内容为例:
1.类内定义静态字符串数组
static char baud_rate_strings[8][10];
2.类外初始化字符串数组
char CxxxDlg::baud_rate_strings[8][10] = {"1200","2400","4800","9600","19200","38400","57600","115200"};
3.初始化函数:
void CSerialPort01Dlg::AddBaudRateToComboBox( CComboBox &m_ctrl, int baud_num )
{
if (baud_num > 8)
baud_num = 8;
for (int i=0; i<baud_num; i++)
{
m_ctrl.AddString(baud_rate_strings[i]);
}
}
这里,注意函数传递 CComboBox 类型的参数用的是引用传递,基本上所有CObject类型的变量作为参数在函数中传递时均利用这种形式,否则会造成编译错误。
关于参数传递方式,参考具体描述
这里只设置了端口号和波特率两个可变的参数,其它的参数因为所涉及的项目中完全固定,所以均采用程序内置默认。
在端口号和波特率设置好以后,通过开头提到的初始化函数就可以打开串口了,在对话框的操作中,这个动作通过单击”确认设置“完成,具体操作步骤是:
if(FALSE == m_comm_Port[0].InitPort(this, com_num_virt, baud_rate_virt))
{
MessageBox("虚拟端口未创建或参数配置错误!","虚拟端口打开失败",MB_OK);
return;
}
m_comm_Port[0].StartMonitoring();
com_virt_open = TRUE;
其中的m_comm_Port[0]
是(一)中给过定义的,com_virt_open
是在 .h 中定义的 BOOL 类型变量,表征串口已经打开
嗅探结果列表
需要有一个空间对嗅探结果进行显示,由于上位机软件和下位机硬件之间的发送内容需要一个时序来进行标记,以便明确究竟是二者怎样进行通信的,那么最好的就是使用 ListControl 控件
关于这个控件的使用,可以参考[2]
到此为止明天过年!
参考
[1] MFC 组合框ComboBox总结
[2] 一步一步学List Control控件的用法(这是一个系列,从这个链接可以顺次看到整个系列)