1.将十六进制字符(unsigned char 一个字节),通过CString类的Format函数,将char转成十六进制字符串
2.再将十六进制字符串通过 “ ChangeNum ” 函数转成十进制数;
3.最后通过gcvt函数再将十进制数转成字符串
//ADC Value Display
CString ADCVal,Temp; //接收数据转换成十六进制buffer
char DAdcVal[20]; //浮点转字符串buffer
double v1=0;
int v=0;
//********************************
//将十六进制字符转成十六进制字符串
//********************************
ADCVal=""; //变量清零
Temp="";
memset(DAdcVal,0,sizeof(DAdcVal));
Temp.Format("%2X",rxdata[5]); //data2为高字节, Format函数中的"%2X"代表转成字符型数据
//rxdata[i]是主程序中定义的unsigned char型数据
ADCVal=Temp;
Temp.Format("%2X",rxdata[4]); //data1为低字节
ADCVal+=Temp;
ADCVal.Replace(" ",NULL); //去掉数据中间的空格
//*********************************
//将十六进制字符串转成十进制数
//*********************************
v=ChangeNum(ADCVal,ADCVal.GetLength()); //将十六进制字符转成十进制数字
v1=v*(3.3/4096); //按协议计算ADC的数值
//*********************************
//将十进制数转成字符串
//*********************************
gcvt(v1,5,DAdcVal); //将十进制浮点数转换成字符串
if (rxdata[2]==0x04) //如是04 command显示ADC值
{
m_Register_frm.m_TemData = DAdcVal;
m_Register_frm.SetDlgItemText(IDC_EDIT_TemData,m_Register_frm.m_TemData);
}
ChangeNum函数的实现:
//---------------------------------------------------------------------
//十六进制字符串转十进制数函数
//---------------------------------------------------------------------
int ChangeNum (CString str, int length)
{
char revstr[16]={0}; //根据十六进制字符串的长度,这里注意数组不要越界
int num[16]={0};
int count=1;
int result=0;
strcpy(revstr,str);
for (int i=length-1;i>=0;i--)
{
if ((revstr[i]>='0') && (revstr[i]<='9'))
num[i]=revstr[i]-48;//字符0的ASCII值为48
else if ((revstr[i]>='a') && (revstr[i]<='f'))
num[i]=revstr[i]-'a'+10;
else if ((revstr[i]>='A') && (revstr[i]<='F'))
num[i]=revstr[i]-'A'+10;
else
num[i]=0;
result=result+num[i]*count;
count=count*16;//十六进制(如果是八进制就在这里乘以8)
}
return result;
}
gcvt函数的使用,参考blog:
http://blog.csdn.net/phenixyf/article/details/11852417
本例在程序中位置