描述:
最近用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:
晕了。
mess相当于一指针&mess[0],你3楼说错误,是不是你用mess[x]啦?
value是一个值,是从串口接收到的,sprintf把其用%x的形式格式化到buf中去,那么你printf("%s",mess)时(或MessageBox(mess)或xxxfun(mess)时),显示的就是要求的16进制,更多的形式变化可看4楼代码相应位置。
解决方案3:
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;
}
转换一下:
static char *hex2str(char *obuf, const char *buf, int len)
{
#define BIN2HEX(x) ((x) < 10 ?&nb