Rocker 发表于 2009-7-7 15:07:39

字符串转BCD码函数

函数:实现字符串转换成BCD码,例如 A1B2C367转换完后 0xA1 0xB2 0xC7 0x67

我写了下面的函数,调试之后不能达到想要的结果,请教一下大侠我的思路有没有问题。

void CharToBcd(char * Cbuf, BYTE * Bbuf,short *blen)
{
   short i,j;
   short tem_len;

   tem_len = strlen(Cbuf);


   for(i = 0;i < tem_len;i++)
   {
      switch(Cbuf)
      {
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
            Cbuf = ((Cbuf-0x30)&0x0f);
            break;
         case 'A':
         case 'a':
            Cbuf = 0x0A;
            break;
         case 'B':
         case 'b':
            Cbuf = 0x0B;
            break;
         case 'C':
         case 'c':
            Cbuf = 0x0C;
            break;
         case 'D':
         case 'd':
            Cbuf = 0x0D;
            break;
         case 'E':
         case 'e':
            Cbuf = 0x0E;
            break;
         case 'F':
         case 'f':
            Cbuf = 0x0F;
            break;
      }

   }

   if((tem_len % 2) == 0)
   {
      for(i = 0 ,j =0; i < tem_len;i++,j++)
      {
          Bbuf = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf&0x0f);
      }
      *blen = (tem_len/2);
   }
   else
   {
   if(tem_len == 1)
   {
          Bbuf = (BYTE)(Cbuf&0x0f);
          *blen = tem_len;
   }
   else
   {
      for(i = 0 ,j =0; i < tem_len-1;i++,j++)
      {
            Bbuf = (BYTE)((Cbuf<<4)&0xf0)||(Cbuf&0x0f);
      }
      Bbuf = (BYTE)(Cbuf&0x0f);
      *blen = (tem_len/2)+1;
   }
   }

}

Rocker 发表于 2009-7-7 16:19:45

调试通过,望拍砖!!!

void CharToBcd(char * Cbuf, BYTE * Bbuf,short *blen)
{
   short i,j;
   short tem_len;
   BYTE tem_h;
   BYTE tem_l;

   tem_len = strlen(Cbuf);


   for(i = 0;i < tem_len;i++)
   {
      switch(Cbuf)
      {
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
            Cbuf = ((Cbuf-0x30)&0x0f);
            break;
         case 'A':
         case 'a':
            Cbuf = 0x0A;
            break;
         case 'B':
         case 'b':
            Cbuf = 0x0B;
            break;
         case 'C':
         case 'c':
            Cbuf = 0x0C;
            break;
         case 'D':
         case 'd':
            Cbuf = 0x0D;
            break;
         case 'E':
         case 'e':
            Cbuf = 0x0E;
            break;
         case 'F':
         case 'f':
            Cbuf = 0x0F;
            break;
      }

   }

   if((tem_len % 2) == 0)
   {
      for(i = 0 ,j =0; i < tem_len;i++,j++)
      {
          tem_h = (BYTE)(Cbuf<<4)&0xf0 ;
          tem_l = (BYTE)(Cbuf[++i]&0x0f);
          Bbuf = tem_h |tem_l;
      }
      *blen = (tem_len/2);
   }
   else
   {
   if(tem_len == 1)
   {
          Bbuf = (BYTE)(Cbuf&0x0f);
          *blen = tem_len;
   }
   else
   {
      for(i = 0 ,j =0; i < tem_len-1;i++,j++)
      {
          tem_h = (BYTE)(Cbuf<<4)&0xf0 ;
          tem_l = (BYTE)(Cbuf[++i]&0x0f);
          Bbuf = tem_h |tem_l;
      }
      Bbuf = (BYTE)(Cbuf&0x0f);
      *blen = (tem_len/2)+1;
   }
   }

}

cowboy 发表于 2009-7-7 17:16:02

好象有点繁复

mcu5i51 发表于 2009-7-7 17:20:14

atoi() atol()...

gengxt001 发表于 2009-7-7 17:32:12

原理都一样,就看自己怎么实现了。赞一下楼主。我自己也写过类似的转换函数。

我比较奇怪的是,为什么有的协议非要用ASCII传送,报文是0x12 0xA3 0x7E,发送时非要转换成“12A37E”再传送。这是出于什么目的?仅仅是为了观察报文时直观么?

gengxt001 发表于 2009-7-7 17:34:24

3楼兄弟所说,对数据变换有用,但对一个完整的协议帧,就有问题了。

gengxt001 发表于 2009-7-7 17:35:58

观察报文直观了,处理起来却麻烦了,明显得不偿失。我个人认为,不知道有哪位朋友可以解释一下如此的目的?

stefgq 发表于 2009-7-7 23:04:56

看看

Rocker 发表于 2009-7-8 08:40:28

我用到比较多的是在 串口通信过程中,数据进来的是字符串,要把他转换成BCD码发送给串口设备!

ice110 发表于 2009-7-19 18:12:51

'------------------2位16进制字符串转8位2进制字符串 向下位机发送 -----------------------------
Public Function HexStrToStr(strHex As String) As String "FF"--->"1111 1111"
Dim i As Integer
Dim strBin As Integer
HexStrToStr = ""
For i = 1 To Len(strHex) Step 2
            If i + 1 > Len(strHex) Then
                     strBin = "&H" & "0" & Mid$(strHex, i, 2)   
            Else
                     strBin = "&H" & Mid$(strHex, i, 2)
            End If

Next
HexStrToStr = CByte(strBin)
End Function
'接收下位机发送的数据并转换成16进制可显示字符
Public Function StrToHexStr(strBin As String) As String      
Dim i As Integer   
Dim strHex As String
StrToHexStr = ""
For i = 1 To Len(strBin) Step 2   
    If i = 1 Then
      strHex = Right("0" & Hex$(Asc(Mid$(strBin, i, 2))), 2)
    Else
      strHex = Right((strHex & Hex$(Asc(Mid$(strBin, i, 2)))), 2)
   End If
Next
      StrToHexStr = strHex
End Function
'---------------------------------------------------------------------------------------------------------------------
大家看看能修改的更快更稳定吗?并把里面的bug修改了.

stefgq 发表于 2009-7-19 19:05:22

有点烦了

alexmayer 发表于 2009-9-8 17:32:38

楼上的兄弟有简单的方法么?

wzxavr 发表于 2010-6-8 10:43:09

MARK
页: [1]
查看完整版本: 字符串转BCD码函数