最近用API函数编写了串口通信程序
handlePort_ = CreateFile(portName,  
    GENERIC_READ | GENERIC_WRITE,       
    0,                                  
    NULL,                               
    OPEN_EXISTING,                       
    0,                                  
    NULL);   
ReadFile(handlePort_,  
    inputData,               
    sizeBuffer,              
    &length,                
    NULL) == 0) SerialThread::Run()
{
        char mess[MAX_MESSAGE];
        unsigned int lenBuff = MAX_MESSAGE;
        unsigned long lenMessage,len,k;
        static CString outPut,strtemp;        if (SCC::serialCtl().read_scc(mess,lenBuff,lenMessage) == TRUE)
        {
          if (lenMessage > 0)
          {
            outPut = outPut + mess;
            ptrDlg->SetDlgItemText(IDC_MONITOR_REC,mess);
CFile   m_file; 
m_file.Open("data.txt",CFile::modeCreate |CFile::modeWrite |CFile::typeBinary); 
m_file.Write(outPut,outPut.GetLength());   
m_file.Close(); 
m_file.Flush(); */ 
}
这样的话我存成的文件是字符,用二进制模式打开可以看到数据是正确的
可是现在想直接看到数据,本来以为可以把mess直接转换成字符,例如从串口收到0x14,则转换成"14"
可是mess[100]没有办法变成16进制数型,这个0x14在哪里啊,应该怎么处理,数据都在这里了,可就是显示不出来很郁闷

解决方案 »

  1.   

    转换一下:
    static char *hex2str(char *obuf, const char *buf, int len)
    {
    #define BIN2HEX(x) ((x) < 10 ? '0'+(x) : (x)+'A'-10) char *ret = obuf;
    while (len--)
    {
    *obuf++ = BIN2HEX(*buf>>4);
    *obuf++ = BIN2HEX(*buf&0xf);
    buf++;
    }
    *obuf = '\0'; return ret;
    }顺序不对的话,自己修改一下。
      

  2.   

    如果嫌麻烦,可以用sprintf(mess,"%x",value);
      

  3.   

     'sprintf' : cannot convert parameter 1 from 'char' to 'char *'
    2楼的方法看来也是不行,我是从缓存中读取的,mess有100个啊
      

  4.   


    CHAR  * MemToHex(void * pMem, int nSize, CHAR * pBuffer, DWORD dwAddress)
    {
        BYTE * pDat;
        char buf[1024];
        char buf1[1024],buf2[1024];
        int i;
        int a,b,p;
        pDat = (BYTE *)pMem;
        a = nSize/16;
        b = nSize%16;
        pBuffer[0] = 0;
        for(i=0; i<a; i++)
        {
            p = i*16;
            memcpy(buf, pDat+p, 16);
            buf[16]=0;
    MemReplaceVal(buf, 16, (BYTE) 0, ' ');
    MemReplaceVal(buf, 16, (BYTE) 9, ' ');
    MemReplaceVal(buf, 16, (BYTE)10, ' ');
    MemReplaceVal(buf, 16, (BYTE)12, ' ');
    MemReplaceVal(buf, 16, (BYTE)13, ' ');
    MemReplaceVal(buf, 16, (BYTE) 0, ' ');        sprintf(buf2, "%08X: %02X %02X %02X %02X %02X %02X %02X %02X-%02X %02X %02X %02X %02X %02X %02X %02X   %s\r\n",
                dwAddress,
                pDat[p+0],pDat[p+1],pDat[p+2],pDat[p+3],pDat[p+4],pDat[p+5],pDat[p+6],pDat[p+7],
                pDat[p+8],pDat[p+9],pDat[p+10],pDat[p+11],pDat[p+12],pDat[p+13],pDat[p+14],pDat[p+15],buf);
            dwAddress += 0x10;
            strcat(pBuffer, buf2);
        }
    if(b == 0) return pBuffer;
        sprintf(buf2, "%08X: ", dwAddress);
        for(i=0;i<b;i++)
        {
            p=a*16+i;
            if(i == 7) sprintf(buf1, "%02X-", pDat[p]);
            else sprintf(buf1, "%02X ", pDat[p]);
            strcat(buf2, buf1);
        }
        sprintf(buf1, "%*s", 50-b*3, " ");
        strcat(buf2, buf1);
        memcpy(buf, pDat+a*16, b);
        buf[b]=0;
    MemReplaceVal(buf, b ,(BYTE) 0, ' ');
    MemReplaceVal(buf, b ,(BYTE) 9, ' ');
    MemReplaceVal(buf, b ,(BYTE)10, ' ');
    MemReplaceVal(buf, b ,(BYTE)12, ' ');
    MemReplaceVal(buf, b ,(BYTE)13, ' ');
        strcat(pBuffer, buf2);
        strcat(pBuffer, buf);
        return pBuffer;
    }DWORD MemReplaceVal(void * Mem, DWORD dwMemSize, BYTE oldval,BYTE newval)
    {
    BYTE * pByte;
    pByte = (BYTE *)Mem;
    for(DWORD i=0;i<dwMemSize;i++)
    {
    if(pByte[i] == oldval)
    pByte[i] = newval;
    }
    return dwMemSize;
    }
      

  5.   

    H2A(BYTE* bt, TCHAR* pstr, int length)
    {
        for(int i=0; i<length; i++)
        {
            *(pstr+i*2) = "0123456789ABCDEF"[(*(bt+i))>>4 & 0x0f];
            *(pstr+i*2+1) = "0123456789ABCDEF"[(*(bt+i)) & 0x0f];
        }
    }
      

  6.   

    谢谢大家,我现在用的笨办法,从缓存中直接读data[0]到data[5],看来暂时是可以的,就先这样吧
      

  7.   

    晕了。
    mess相当于一指针&mess[0],你3楼说错误,是不是你用mess[x]啦?value是一个值,是从串口接收到的,sprintf把其用%x的形式格式化到buf中去,那么你printf("%s",mess)时(或MessageBox(mess)或xxxfun(mess)时),显示的就是要求的16进制,更多的形式变化可看4楼代码相应位置。
      

  8.   

    Sorry,我看错了。
    mess是读取到的数据?
    那么
    sprintf(strbuf,"%x",mess[i]);更具体的就自行研究吧 strbuf为一足够的内存区域。