由于很多时候,串口通信的协议可能是字符数组构成的,每一个字节都表示一种信息,在调试的时候,将它们输出显示,就需要将hex型式的字符数组转换成便于显示的string字符串,现总结出该函数,仅供参考。
/*************************************************
Function: hex2string
Description: hex字符数组转换成string字符串,用于printf显示等
Input: hex:原字符数组
len:hex数组的长度
Output: ascII:输出的字符串
newlen:输出的字符串长度
Return:
*************************************************/
void hex2string(char *hex,char *ascII,int len,int *newlen)
{
int i = 0;
char newchar[100] = {0};
*newlen=len*3;
for (i = 0; i< len; i++)
{
sprintf(newchar,"%02X ", hex[i]);
strcat(ascII, newchar);
}
}
同样的,string也可以转换成hex用于透传时使用,形如AA010203的字符串,转换成0xAA,0x01,0x02,0x03存入数组中。
/*************************************************
Function: string2hex
Description: 字符串转换成hex,要求str只能是大写字母ABCDEF和数字
Input: str:要转换的字符串
Output: hex:转换后的hex字符数组
Return: 0 成功
1 不符合规则,失败
*************************************************/
int string2hex(char* str,char* hex)
{
int i = 0;
int j = 0;
unsigned char temp = 0;
int str_len = 0;
char str_cpy[100] = {'0'};
strcpy(str_cpy,str);
str_len = strlen(str_cpy);
if(str_len==0)
{
return 1;
}
while(i < str_len)
{
if(str_cpy[i]>='0' && str_cpy[i]<='F')
{
if((str_cpy[i]>='0' && str_cpy[i]<='9'))
{
temp = (str_cpy[i] & 0x0f)<<4;
}
else if(str_cpy[i]>='A' && str_cpy[i]<='F')
{
temp = ((str_cpy[i] + 0x09) & 0x0f)<<4;
}
else
{
return 1;
}
}
else
{
return 1;
}
i++;
if(str_cpy[i]>='0' && str_cpy[i]<='F')
{
if(str_cpy[i]>='0' && str_cpy[i]<='9')
{
temp |= (str_cpy[i] & 0x0f);
}
else if(str_cpy[i]>='A' && str_cpy[i]<='F')
{
temp |= ((str_cpy[i] + 0x09) & 0x0f);
}
else
{
return 1;
}
}
else
{
return 1;
}
i++;
hex[j] = temp;
//printf("%02x",temp);
j++;
}
//printf("\n");
return 0 ;
}
代码只是初步实现简单的功能,而且函数内部都限制了字符串长度,根据实际情况再做修改。