串口通信程序中十六进制格式发送和接收实现

刚刚用MFC编写了一个采集和设定中央空调控制板上参数的应用程序,控制板和PC机之间通过485转串口和串口转USB电路实现通信。程序设计中碰到一个问题是PC端对发送和接收数据格式的处理,控制板可以读懂的协议是一组16进制数,如“66 03 0C 00 01 00 01 00 00 00 00 00 3C 00 3E F5 94”,PC端应用程序可以解析的也是由控制板发送的一组16进制数,而串口通信是二进制字节流进行,发送和接收缓冲区均为char型的数组,发送时如何将字符串类型的16进制数转换为对应大小的10进制数并存进缓冲数组呢?下面的函数可供参考:

HexChar函数的功能是将16进制字符由ASCII码转为相应大小的16进制数

HexChar(char c)

{

    if((c>='0')&&(c<='9'))

        return c-0x30;//?0-9Ì?ºyÁ?Á?¤?Áaaº?¢¨´???º?

    elseif((c>='A')&&(c<='F'))

        return c-'A'+10;//?A-FÌ?Á?¤?Áaaº?¢¨´???º?¤y¨?Á?¤?'C'-'A'+10=12=0x0C

    elseif((c>='a')&&(c<='f'))

        return c-'a'+10;//?a-fÌ?Á?¤?Áaaº?¢¨´???º?

    else

        return 0x10;

}

Str2Hex函数的功能则是将如“66 03 ...”形式的字符串以空格为间隔转换为对应的16进制数并存放在BYTE型(typdef unsigned char BYTE)数组中,data数组作为发送缓冲数组写入串口即可。

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

    {

        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))//D?a¤?¤¡§Ì?16??ºy

            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     {
     str.Format("%02X ",RecBuf[i]);//将接收到的BYTE型数据转换为对应的十六进制
     RecText.Append(str);
    }

你可能感兴趣的:(串口通信程序中十六进制格式发送和接收实现)