要用vc++做一个串口通信的程序,采用mscomm控件来实现。现在的问题是对于接收到的数据,被程序处理成了16进制的格式,怎么把这些数据中的一部分转换成需要的格式?  
  实际情况是:命令以16进制发送,接收到了被程序处理好的16进制数据“02 46 37 35 3c 38 36 3b 33 32 0d”,其中的“3c 38 36 3b 33”是ASCII码,问题是我怎样处理才能把这几个有效字符转换成十进制的数据显示,数据是取这几个ASCII码的第四位,比如上面应有“3b68c”转为243340,谢谢! 

解决方案 »

  1.   

    BYTE in[11] = {0x02, 0x46, 0x37, 0x35, 0x3c, 0x38, 0x36, 0x3b, 0x33, 0x32, 0x0d};
    DWORD dwResult = 0;
    DWORD tmp;
    for(int i = 0; i < 5; i ++)
    {
       dwResult += ((DWORD)(in[i + 4] & 0x0f)) << (i * 4);
    }
    CString str;
    str.Format("%d", dwResult);//转换的代码大致如上
      

  2.   

    请问如果接收的每帧数据如题所示该在下面这个函数里怎么处理,也就是说怎样把你说的算法加进去,呵呵,别笑我笨,我是新手,原来做单片机的,我就是想做个类是串口助手的东西和我的下位机配合使用,就是直接显示数据,请赐教!
    void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
                   
                        VARIANT variant_inp;
                        COleSafeArray safearray_inp;
                        LONG len,k;
                        BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
                        CString strtemp;//
                        if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
                        {
                        variant_inp=m_ctrlComm.GetInput(); //读缓冲区
                        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
                        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
                        for(k=0;k<len;k++)
                        safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
                        for(k=0;k<len;k++) //将数组转换为Cstring型变量
                        {
                        BYTE bt=*(char*)(rxdata+k); //字符型
                        if(m_ctrlHexDisplay.GetCheck())
                        strtemp.Format("%02X ",bt); 
                        //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                        else 
                        strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放
                    
                        m_strRXData+=strtemp; //加入接收编辑框对应字符串 

                        }
                        }

                        UpdateData(FALSE); //更新编辑框内容
    }
      

  3.   

    我改的如下,可是收不到数据了,请大虾们指点:
    void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
                    
       // int flag=0;
                        VARIANT variant_inp;
                        COleSafeArray safearray_inp;
                        LONG len,k;
                        BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
                        CString strtemp;//
                        if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
                        {
                        variant_inp=m_ctrlComm.GetInput(); //读缓冲区
                        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
                        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
                        for(k=0;k<len;k++)
                        safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
                        for(k=0;k<len;k++) //将数组转换为Cstring型变量
                        {
                        BYTE bt=*(char*)(rxdata+k); //字符型
                        if(m_ctrlHexDisplay.GetCheck())
                        strtemp.Format("%02X ",bt); 
                        //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                        else 
                        strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放
    char ch=(char)bt; 
    switch(ch) 

    case 0x02: 
    flag=1;
    point=0;
    break; 
    default: 
    if(flag>0) 
    {   
                                r[point++]=ch;
    if(point==11)
    {    point=0;
         flag=0;
             DWORD dwResult = 0;
                                     for(int i = 0; i < 5; i ++)
     {
                                          dwResult += ((DWORD)(r[i + 4] & 0x0f)) << (i * 4);
     }
                                     CString str;
                                     str.Format("%d", dwResult);
                                     m_strRXData=str;
    }

    break;
    }
                      }
    }
                   UpdateData(FALSE); //更新编辑框内容
    }
      

  4.   

    本来就没有什么十六进制,十进制,计算机里都是二进制,你想怎么显示就怎么显示,显示的时候用格式化输出就可以了strtemp.Format("%02X ",bt);
    改为
    strtemp.Format("%02D ",bt);不要空格就把""里的空格去掉
      

  5.   

    你在內存的數據應該是ASCII碼,
    用atoi就可以了啊