配置工具添加显示IMEI号功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/79241660

要实现的功能就是添加一个”Query IMEI”按钮,工具与模块连接后,当点击这个按钮,会有一个弹出框,并把IMEI号显示在弹出框内。
原理:当点击按钮,会发送一个指令”AT+IMEIQUERY”到模块中,当模块接收到这个指令时,会对应设置好返回一个字符串例如”#IMEI:359865070016863”,我们只需要判断从串口接受到的字符串中是否含有”#IMEI:”字符串,然后截取后面15个数字(IMEI)并显示出来即可.
如下图:
这里写图片描述

在实现功能的过程中,在IMEI后面出现乱码的情况 主要由以下两个问题导致:
1.调用malloc进行堆中分配内存时,一定要进行手动初始化,比如调用memset函数初始化为0
2.我们调用malloc分配的内存是用来存储IMEI号的,这是一串字符串,后面带‘\0’结束符,IMEI号一共是15位,加上结束符,
一共需要至少16个字节的内存空间。

下面是添加功能的具体步骤:

1. 在资源视图中添加按钮,并编辑好按钮的ID以及按钮显示的名称;

这里写图片描述

2. 在消息映射表中添加消息响应函数(按钮是点击事件),定义响应函数,在对应头文件中声明响应函数;

  • 映射表中添加
BEGIN_MESSAGE_MAP(SerialCom, CDialog)
    ON_BN_CLICKED(IDC_IMEI_QUERY, OnImeiQuery)
END_MESSAGE_MAP()
  • 头文件中添加函数声明
afx_msg void OnImeiQuery();  
  • 定义响应函数
void SerialCom::OnImeiQuery()
{
    if(!m_bSerialConnected)
    {
        AfxMessageBox("The connect button not pressed!");
        return;
    }
    char *data_t = "AT+IMEIQUERY";
    sendData(data_t);
}

在发送完指令后,从接收串口数据的ComRecvProc()函数中添加判断是否含有回复的指令头字符串

char *pStart, *pEnd, *pIMEI;
//显示IMEI号的处理
CString Show_IMEI;
if((pIMEI=strstr(cData,CFG_UART_IMEI_HEAD)) != NULL)  //#define CFG_UART_IMEI_HEAD      "#IMEI:"
{
   char *IMEI = (char *)malloc(16); //在堆中申请16个字节的内存空间
   memset(IMEI,0,sizeof(char)*16);//调用malloc()函数申请完内存后需要手动初始化,一般初始化为0
   pIMEI+=6; //跳过"#IMEI:"字符串头
   memcpy(IMEI,pIMEI,15); //将后面15个数字复制到申请的空间中
   Show_IMEI.Format("The IMEI is:%s",IMEI); 
   //%s代表的是字符串,字符串后面有'\0'结束符,所以实际申请的控件比使用的空间至少要多一个字节
   AfxMessageBox(Show_IMEI); //弹出框,显示Show_IMEI的内容
   free(IMEI); //调用malloc()函数申请空间后一定要记得调用free()释放
}  

猜你喜欢

转载自blog.csdn.net/qq_17017545/article/details/79241660