要用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,谢谢!
实际情况是:命令以16进制发送,接收到了被程序处理好的16进制数据“02 46 37 35 3c 38 36 3b 33 32 0d”,其中的“3c 38 36 3b 33”是ASCII码,问题是我怎样处理才能把这几个有效字符转换成十进制的数据显示,数据是取这几个ASCII码的第四位,比如上面应有“3b68c”转为243340,谢谢!
解决方案 »
- 查看维基百科的那个呼吁
- VC程序员之无法选择的命运
- VC中...不使用stdAfx.h有什么后果?
- 如何用ADO打开FOXPRO表中带"%"的字符型字段,请高手指教
- 如何知道OCX文件里面的COM Class名字是什么
- 动态生成控件的问题。
- 如何自定义一个基于对话框的程序的ClassName或WindowName?
- 多文档怎么在view上显示文字?
- 讨论第三层代理,有意者请
- CButtonST在VS2005使用时报错,有遇到过得希望指导下。
- cvWriteFrame( CvVideoWriter* writer, const IplImage* image )生成的视频为什么不能播放!
- 采集的netflow数据中大部分数据的tcp flags字段都是0,只有很少一部分才有ack、syn标志,是什么原因啊?
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);//转换的代码大致如上
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); //更新编辑框内容
}
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); //更新编辑框内容
}
改为
strtemp.Format("%02D ",bt);不要空格就把""里的空格去掉
用atoi就可以了啊