最近用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在哪里啊,应该怎么处理,数据都在这里了,可就是显示不出来很郁闷
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在哪里啊,应该怎么处理,数据都在这里了,可就是显示不出来很郁闷
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楼的方法看来也是不行,我是从缓存中读取的,mess有100个啊
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;
}
{
for(int i=0; i<length; i++)
{
*(pstr+i*2) = "0123456789ABCDEF"[(*(bt+i))>>4 & 0x0f];
*(pstr+i*2+1) = "0123456789ABCDEF"[(*(bt+i)) & 0x0f];
}
}
mess相当于一指针&mess[0],你3楼说错误,是不是你用mess[x]啦?value是一个值,是从串口接收到的,sprintf把其用%x的形式格式化到buf中去,那么你printf("%s",mess)时(或MessageBox(mess)或xxxfun(mess)时),显示的就是要求的16进制,更多的形式变化可看4楼代码相应位置。
mess是读取到的数据?
那么
sprintf(strbuf,"%x",mess[i]);更具体的就自行研究吧 strbuf为一足够的内存区域。