最近要用MFC开发一个上位机监控程序,上位机和控制板之间使用RS232/485协议通信。其中一个问题是MFC对于串口收发事件处理函数中需要对发送和接收的数据进行进制转换。处理函数中对串口的读写是以二进制字节流形式,而上位机界面控件中输入和回显的都是十进制,所以涉及到字符串的十进制到二进制转换的问题。
设置的参数经过包装后成为十六进制的字符串,如“66 03 0C 00 01 00 01 00 00 00 00 00 3C 00 3E F5 94“,发送和接收缓冲区均为char型的数组,发送时如何将字符串类型十六进制串转换为二进制数组呢?下面的函数可以实现转换过程:
HexChar函数的功能是将十六进制字符由ASCII码转为相应大小的数值:
char HexChar(char c)
{
if((c>='0')&&(c<='9'))
return c-'0'; //将0-9的数字字符转为十六进制格式
else if((c>='A')&&(c<='F'))
return c-'A'+10; //将A-F的字符转为十六进制格式,例如字符'C'-'A'+10=12=0x0C
else if((c>='a')&&(c<='f'))
return c-'a'+10; //将a-f的字符转为十六进制格式
else
return 0x10;
}
Str2Hex函数的功能则是将如“66 03 ...”形式的字符串以空格为间隔转换为对应的二进制存放在BYTE型(typdef unsigned char BYTE)数组中,data数组作为发送缓冲数组写入串口即可。
int Str2Hex(CString str, BYTE *data)
{
int t,t1;
int rlen=0,len=str.GetLength();
if(len==1)
{
char h=str[0];
t=HexChar(h);
data[0]=(BYTE)t;
rlen++;
}
//data.SetSize(len/2);
for(int i=0;i<len;)
{
char l,h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))//判断为非法的16进制数
break;
else
t=t*16+t1;
i++;
data[rlen]=(BYTE)t;
rlen++;
}
return rlen;
}
对于接收到的数据,位于接收缓冲区的BYTE数组RecBuf中,如果要以相应大小的16进制形式显示,刚可以将数组中每一个元素以下列格式转换并放入字符串RecText中,即可实现以16进制显示。
CString RecText,str;
for(int i=0;i<Rlen;i++)
{
str.Format("%02X ",RecBuf[i]);//将接收到的BYTE型数据转换为对应的十六进制
RecText.Append(str);
}