在C中转换为ASCII

Joh*_*itt 7 c embedded microcontroller ascii

使用微控制器(PIC18F4580),我需要收集数据并将其发送到SD卡以供以后分析.它收集的数据的值介于0和1023之间,或者0x0和0x3FF之间.

所以我需要做的是将1023转换为基本的10个字符串ASCII值(0x31,0x30,0x32,0x33,...).

我的问题是,我能想到的将数字分开的唯一方法需要进行大量的划分.

char temp[4];
temp[0] = 1023 % 10;
temp[1] = (1023 % 100) / 10;
temp[2] = (1023 % 1000) / 100;
temp[3] = (1023 % 10000) / 1000;
Run Code Online (Sandbox Code Playgroud)

使用此方法,查找n位十进制数的ASCII值需要2n-1个除法.有没有更快的方法?

最终目标是结束SD卡上的.csv文件,该文件可以快速插入任何笔记本电脑,以便在Excel中查看数据图表.

Cli*_*ord 15

显而易见的解决方案是将数据转换为ASCII,而是以二进制格式存储.这样你需要担心的是数据的字节顺序.如果执行后面分析的系统比嵌入式目标强大得多,那么让它处理转换和字节顺序是有意义的.

另一方面,与将数据传送到SD卡所花费的时间相比,/和%的执行时间可能是微不足道的.所以要确保你正在优化正确的事情.


Vat*_*ine 2

有一种使用减法的方法,但我不相信它比在“普通”CPU 上使用减法和模数更快(在嵌入式环境中可能有所不同)。

像这样的东西:

char makedigit (int *number, int base)
{
  static char map[] = "0123456789";
  int ix;

  for (ix=0; *number >= base; ix++) { *number -= base; }

  return map[ix];
}


char *makestring (int number)
{
  static char tmp[5];

  tmp[0] = makedigit(&number, 1000);
  tmp[1] = makedigit(&number, 100);
  tmp[2] = makedigit(&number, 10);
  tmp[3] = makedigit(&number, 1);
  tmp[4] = '\0';

  return tmp;
}
Run Code Online (Sandbox Code Playgroud)

然后,调用makestring()应该会产生一个(静态的,因此在覆盖之前复制它)带有转换后的数字(零前缀,4个字符宽度,因为原始假设是0-1023范围内的值)的字符串。