“拿来主义”——怎样嗅探一个串口通信程序与硬件之间的通信(三)

嗅探结果列表(续)

对ListControl控件进行初始化函数,代码如下:

void CSerialPort01Dlg::InitMyListControl( CListCtrl &m_ctrl )
{
    CRect size_of_list;
    int time_width = 80;
    int num_width = 50;
    m_ctrl.GetWindowRect(size_of_list);                 //获取 ListControl控件的尺寸
    m_ctrl.InsertColumn(0,"Time",LVCFMT_LEFT,time_width,-1);    //设置第一列为时间,宽度100
    m_ctrl.InsertColumn(1,"NO.",LVCFMT_CENTER,num_width,-1);
    m_ctrl.InsertColumn(2,"Command",LVCFMT_CENTER,size_of_list.right-size_of_list.left-time_width-num_width,-1);//设置第二列为命令内容,宽度为余下的全部
}

(由于这里我的工程叫做SerialPort01,所以类名如上)
利用该函数将两个ListControl全部初始化,函数执行放在:

BOOL CSerialPort01Dlg::OnInitDialog()

当中,初始化结果是:
这里写图片描述

进一步的,向这个ListControl当中添加内容!

ListControl 添加内容

这部分涉及到几个事儿:

  1. 如何将指定内容顺次填写到ListControl当中 [1]
  2. 如何生成当前系统时间 [2] [3]
  3. 怎样在收到上位、下位机串口信息的时候准确确定时间

将系统时间与特定字符串填写至 ListControl 中的代码如下:

void CSerialPort01Dlg::InsertTextToMyList( CListCtrl &m_ctrl, CString command, int row)
{
//  CTime my_time = CTime::GetCurrentTime();    //获取时间  
//  CString current_time = my_time.Format("%H:%M:%S");  //显示时间
    CString current_time;

    GetLocalTime(&time_more_precise);
    current_time.Format("%d:%d:%d:%d",time_more_precise.wHour,time_more_precise.wMinute,time_more_precise.wSecond,time_more_precise.wMilliseconds);
    m_ctrl.InsertItem(row-1,current_time);              //显示时间

    current_time.Format("%d",row);              // 显示序号
    m_ctrl.SetItemText(row-1,1,current_time);   // 显示序号

    m_ctrl.SetItemText(row-1,2,command);    // 显示内容
}

由于CTime只能精确到秒,所以采用了更加精确的一种方法进行系统时间的获取

将这个函数放在接收消息响应函数:

LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )

当中,就可以在接收到特定程序或者硬件的串口内容之后,将它们反映在不同的ListControl当中

具体代码参照[3]中的内容,编写如下:

LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )
{
    //////////////////////////////////////////////////////////////////////////
    // 接收后处理
    CString received_char;
    received_char.Format("0x%x",ch);
    // 端口分开
    switch (port)//这个port是硬件中的端口编号
    // port1: com1,本机物理端口,对应的变量是 m_comm_Port[1]
    // port2: com2, 本机虚拟端口,对应的变量是 m_comm_Port[0]
    {
    case 1://物理端口
        // 收到物理端口的内容之后,转手发送到虚拟端口
        send_up_buffer.Format("%c",(char)ch);
        m_comm_Port[0].WriteToPort(send_up_buffer,send_up_buffer.GetLength());
        InsertTextToMyList(m_ctrl_listbox_down,received_char,++row_down_sent);
        break;
    case 2://虚拟端口
        //////////////////////////////////////////////////////////////////////////
        // 收到虚拟端口的内容之后,转手发送到物理端口
        send_down_buffer.Format("%c",(char)ch);
        m_comm_Port[1].WriteToPort(send_down_buffer,send_down_buffer.GetLength());
        InsertTextToMyList(m_ctrl_listbox_up,received_char,++row_up_sent);
//////////////////////////////////////////////////////////////////////////
        break;
    }


    //////////////////////////////////////////////////////////////////////////
    return 0;
}

至此全部的功能实现完毕。


参考

[1] 一步一步学List Control控件的用法(第二步)—-创建第一行
CTime类及其变量使用
[2] Ctime时间类的相关用法
[3] 请问怎么取得系统的时间,要精确到毫秒,CTime只能精确到秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值