2013-12-07 130 views
2

我正在使用PIC微处理器,并且需要将AD转换器的值发送到终端(本例中为超级终端)。现在,终端只能理解ASCII。 AD转换器提供一个字节的值(范围从0到255)。如何将这个二进制数转换为ASCII?从字节(二进制)转换为C中的ASCII码

要完全清楚,该字节是二进制的。所以0100 0000应导致64。当然这意味着需要发送2个ASCII码到PC。

编辑:显然我在这里并不完全清楚。我需要二进制数字的ASCII码以及二进制数字,所以我可以通过芯片制造商提供的USB模板发送它。

编辑2:后一些更多的钻研等话题,this答案促使我尝试itoa()utoa()。现在,itoa()的作品,但不幸的是没有签名的charachters。 utoa()将用于未签名的字符,但不起作用。下面是应该能够发生什么一个例子:所以每次的ASCII字符应该被送到USB_In_Buffer

char USB_In_Buffer[64]; 
char myValue = 0x55; 

itoa(myValue, USB_In_Buffer); 
putUSBUSART(USB_In_Buffer, 3); 

。然后,写入该缓冲区的字符总数应该被用作putUSBUSART()中的第二个参数。我只需要将数字转换为ASCII,因此不需要实现整个字符集。

编辑3:因为一些自动功能似乎不被支持,我认为这不会很难做出我自己的功能。

if(ADCONvalue/100 != 0){ 
    res++; 
    USB_In_Buffer[0] = (ADCONvalue/100) + 0x30; 
} 
if(ADCONvalue/10 != 0){ 
    res++; 
    if(res == 1){ 
     USB_In_Buffer[0] = (ADCONvalue/10) + 0x30; 
    }else{ 
     USB_In_Buffer[1] = (ADCONvalue/10) + 0x30; 
    } 

} 
res++; 
if(res == 1){ 
    USB_In_Buffer[0] = ADCONvalue % 10 + 0x30; 
}else if(res == 2){ 
    USB_In_Buffer[1] = ADCONvalue % 10 + 0x30; 
}else{ 
    USB_In_Buffer[2] = ADCONvalue % 10 + 0x30; 
} 
putUSBUSART(USB_In_Buffer, res); 

但是在某处似乎有错误。小数字可以工作(0-99),但由于某种原因,应该有121,它显示1<1。对于更大的数字,所有的字符都是非数字的。

编辑4:重新检查我的代码后,我发现错误。首先,ADCONvaluechar,而不是unsigned char。另外我忘了做十分之一%10。当前工作代码:

if(ADCONvalue/100 != 0){ 
    res++; 
    USB_In_Buffer[0] = (ADCONvalue/100) + 0x30; 
} 
if(ADCONvalue/10 != 0){ 
    res++; 
    if(res == 1){ 
     USB_In_Buffer[0] = (ADCONvalue/10)%10 + 0x30; 
    }else{ 
     USB_In_Buffer[1] = (ADCONvalue/10)%10 + 0x30; 
    } 

} 
res++; 
if(res == 1){ 
    USB_In_Buffer[0] = ADCONvalue % 10 + 0x30; 
}else if(res == 2){ 
    USB_In_Buffer[1] = ADCONvalue % 10 + 0x30; 
}else{ 
    USB_In_Buffer[2] = ADCONvalue % 10 + 0x30; 
} 
putUSBUSART(USB_In_Buffer, res); 
+0

只是让你知道:超级终端不使用ASCII;它使用用户默认代码页(例如Windows-1252)。当然,您可能使用的任何字符集都是ASCII的超集,它们对共享字符具有相同的(8位)编码。 –

+0

请参阅我的更新回答。 – alk

回答

2

下面是通过除以100,如图10所示,然后使用剩余分解一个unsigned char成十进制的方式:

#include <stdio.h> 

int main (void) { 
    unsigned char val = 137; 
    unsigned char res; 

    printf("\n\nHundredths: %u\n", (int)((val/100))); 
    val = val % 100; 
    printf("Tenths:  %u\n", (int)val/10); 
    printf("Ones:  %u\n", (int)val % 10); 

    return 0; 
} 

程序输出:

Hundredths: 1 
Tenths:  3 
Ones:  7 

要转换为ASCII您可以将48添加到每个整数值。这些数字中的每一个的ASCII代码将是49,51和55.

+0

好奇,为什么'“%u'”与'int'参数?看起来像删除所有'(int)'演员会更好。 – chux

3

您可能会喜欢看printf()系列函数。

char str[32] = ""; 
unsigned char byte = 42; 
snprintf(str, sizeof(str), "%hhu", byte); 
printf("'%s'", str); /* This is a debug statement to check what's be placed in str. */ 

打印出

'42' 

更新参照在OP的更新中提到的 “发送” 功能:

具有转换的byte整数vlaue使用snprintf()其字母数字表示到后上面,它可以放在发送缓冲区中,这样做:

putUSBUSART(str, strlen(str)); 
+1

如果可用,请使用'snprintf()'。 – 2013-12-07 18:21:02

+1

我想知道'printf'家族是否可以在他的微控制器上使用。 – Bert

+0

但是'printf'和'snprintf'在终端上写什么东西?我需要通过USB发送给PC,所以我不能打印一些东西。 – jdepypere

3

构建IntToHex()辅助函数。

static char IntToHex(unsigned x) { 
    x &= 15; 
    if (x <= 9) return x + '0'; 
    return x - 10 + 'A'; 
    } 

unsigned char ADConverter; 
char s[3]; 
s[0] = IntToHex(ADConverter >> 4); 
s[1] = IntToHex(ADConverter); 
s[2] = '\0'; 
send(s); 

对于反向看到hexadecimal ASCII chars conversion

1

用于从符号短二进制值转换为文本字符串作为十进制数字通用功能如下设置有伴侣功能沿着转换一个无符号短二进制值以十六进制数字形式显示文本字符串

我想,如果你改变了shortlongunsigned shortunsigned long相同的逻辑将转换签订长二进制值十进制数字文字和一个unsigned long二进制值分别为十六进制数字文本。

/* 
* char *ShortToString (short sVal, char *pOutText, int iLen) 
* 
* Input: sVal  - binary value as a signed short to convert to text 
*    pOutText - pointer to a character array to receive the text 
*    iLen  - length of the character array in characters 
* 
* Returns: char * - saved value of pOutText, pointer to beginning of output buffer 
* 
* Description: Converts the signed binary value of sVal into a text string of decimal digits. 
*     If the value of sVal is negative, a minus sign is the first character. 
*     If the output buffer length is too small, astericks are put into the buffer. 
* 
*     WARNING: Buffer must be sized to include a terminating zero for the end 
*       of string character. 
**/ 
char *ShortToString (short sVal, char *pOutText, int iLen) 
{ 
    char *pOutTextSave = pOutText; 
    char *pOutTextBegin = pOutText; 

    if (sVal < 0) { 
     sVal *= -1; 
     *pOutText++ = '-'; 
    } 
    pOutTextBegin = pOutText; // remember where beginning of numeric string is 

    // generate text digits in order from least significant to most significant 
    do { 
     *pOutText++ = (sVal % 10) + '0'; // convert least signicant decimal digit to text character 
     sVal /= 10;      // shift the binary value one decimal digit righ 
    } while (sVal > 0 && pOutText + 1 < pOutTextSave + iLen); 

    *pOutText = 0; // end of string terminator 
    pOutText--;  // back up one to point to last character. 

    if (sVal) { 
     // if there is insufficient room in the provided buffer for the string of digits 
     // then indicate by filling the buffer with astericks. 
     pOutTextBegin = pOutTextSave; 
     while (pOutTextBegin + 1 < pOutTextSave + iLen) {*pOutTextBegin++ = '*'; } 
     *pOutTextBegin = 0; // end of string terminator 
    } else { 
     // reverse the string so that digits are in the right order, 
     // most significant to least significant. we do this by swapping digits 
     // until we come to the middle which means that everything is in order. 
     while (pOutTextBegin < pOutText) { 
      char k = *pOutTextBegin; 
      *pOutTextBegin = *pOutText; 
      *pOutText = k; 
      pOutTextBegin++; pOutText--; 
     } 
    } 

    return pOutTextSave; 
} 

/* 
* char *HexShortToString (unsigned short usVal, char *pOutText, int iLen) 
* 
* Input: usVal  - binary value as an unsigned short to convert to text 
*    pOutText - pointer to a character array to receive the text 
*    iLen  - length of the character array in characters 
* 
* Returns: char * - saved value of pOutText, pointer to beginning of output buffer 
* 
* Description: Converts the unsigned binary value of sVal into a text string of hex digits. 
*     If the output buffer length is too small, astericks are put into the buffer. 
* 
*     WARNING: Buffer must be sized to include a terminating zero for the end 
*       of string character. 
**/ 
char *HexShortToString (unsigned short usVal, char *pOutText, int iLen) 
{ 
    char *pOutTextSave = pOutText; 

    // generate text digits in order from least significant to most significant 
    do { 
     unsigned char uChar = usVal & 0x000f; 

     *pOutText++ = (uChar < 10) ? uChar + '0' : uChar - 10 + 'A'; // convert least signicant hex digit to text character 
     usVal >>= 4;      // shift the binary value one hex digit righ 
    } while (usVal > 0 && pOutText + 1 < pOutTextSave + iLen); 

    *pOutText = 0; // end of string terminator 
    pOutText--;  // back up one to point to last character. 

    if (usVal) { 
     // if there is insufficient room in the provided buffer for the string of digits 
     // then indicate by filling the buffer with astericks. 
     pOutText = pOutTextSave; 
     while (pOutText + 1 < pOutTextSave + iLen) {*pOutText++ = '*'; } 
     *pOutText = 0; // end of string terminator 
    } else { 
     char *pOutTextBegin = pOutTextSave; 

     // reverse the string so that digits are in the right order, 
     // most significant to least significant. we do this by swapping digits 
     // until we come to the middle which means that everything is in order. 
     while (pOutTextBegin < pOutText) { 
      char k = *pOutTextBegin; 
      *pOutTextBegin = *pOutText; 
      *pOutText = k; 
      pOutTextBegin++; pOutText--; 
     } 
    } 

    return pOutTextSave; 
} 

一个简单的测试工具如下。

int main(int argc, char **argv) 
{ 
    char pOutBuff[16], pOutBuffHex[16]; 
    char *p, *pHex; 
    short sVal, sLen; 

    p = ShortToString((sVal = 0), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 0), pOutBuff, (sLen = 2)); 
    printf (" sVal = %d ShortToString() p = %s len = %d\n", sVal, p, sLen); 
    p = ShortToString((sVal = 1), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -1), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 12), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 12), pOutBuff, (sLen = 2)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12), pOutBuff, (sLen = 2)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 12), pOutBuff, (sLen = 3)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12), pOutBuff, (sLen = 3)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 12), pOutBuff, (sLen = 4)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12), pOutBuff, (sLen = 4)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12), pOutBuff, (sLen = 5)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf ("  sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 103), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -103), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 100), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -100), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 123), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -123), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 1234), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -1234), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 12345), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -12345), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = 32767), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 
    p = ShortToString((sVal = -32767), pOutBuff, (sLen = 15)); 
    pHex = HexShortToString(sVal, pOutBuffHex, sLen); 
    printf (" sVal = %d ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen); 

    return 0; 
} 

它产生以下输出。

sVal = 0 ShortToString() p = 0, 0x0 pHex=0 len = 15 
sVal = 0 ShortToString() p = 0 len = 2 
sVal = 1 ShortToString() p = 1, 0x1 pHex=1 len = 15 
sVal = -1 ShortToString() p = -1, 0xffffffff pHex=FFFF len = 15 
sVal = 12 ShortToString() p = 12, 0xc pHex=C len = 15 
sVal = -12 ShortToString() p = -12, 0xfffffff4 pHex=FFF4 len = 15 
    sVal = 12 ShortToString() p = *, 0xc pHex=C len = 2 
    sVal = -12 ShortToString() p = *, 0xfffffff4 pHex=* len = 2 
    sVal = 12 ShortToString() p = 12, 0xc pHex=C len = 3 
    sVal = -12 ShortToString() p = **, 0xfffffff4 pHex=** len = 3 
    sVal = 12 ShortToString() p = 12, 0xc pHex=C len = 4 
    sVal = -12 ShortToString() p = -12, 0xfffffff4 pHex=*** len = 4 
    sVal = -12 ShortToString() p = -12, 0xfffffff4 pHex=FFF4 len = 5 
sVal = 103 ShortToString() p = 103, 0x67 pHex=67 len = 15 
sVal = -103 ShortToString() p = -103, 0xffffff99 pHex=FF99 len = 15 
sVal = 100 ShortToString() p = 100, 0x64 pHex=64 len = 15 
sVal = -100 ShortToString() p = -100, 0xffffff9c pHex=FF9C len = 15 
sVal = 123 ShortToString() p = 123, 0x7b pHex=7B len = 15 
sVal = -123 ShortToString() p = -123, 0xffffff85 pHex=FF85 len = 15 
sVal = 1234 ShortToString() p = 1234, 0x4d2 pHex=4D2 len = 15 
sVal = -1234 ShortToString() p = -1234, 0xfffffb2e pHex=FB2E len = 15 
sVal = 12345 ShortToString() p = 12345, 0x3039 pHex=3039 len = 15 
sVal = -12345 ShortToString() p = -12345, 0xffffcfc7 pHex=CFC7 len = 15 
sVal = 32767 ShortToString() p = 32767, 0x7fff pHex=7FFF len = 15 
sVal = -32767 ShortToString() p = -32767, 0xffff8001 pHex=8001 len = 15 
相关问题