[ad_1]
大家好,
这被用作我如何进行这个思考练习。
我有一个从平衡传感器返回值的联合。 在串行监视器中工作正常,但我试图在液晶显示屏上显示它,一些探索表明该功能可以显示
lcd.print()
只会在屏幕上打印一个字符。
我尝试过的:
将联合的输出转换为字符串,问题是该系统上不存在字符串,
char[]
确实存在,所以我可以做吗
char readOut[8]; for(int a =0; a<=7; a++) gyro.output.z = readOut[a];
问题是如何将数组拆分为单个值,然后将其上传到字符[]??
你明白我想去哪里了……
我正在尝试使用平衡传感器来准确报告“压力”是否水平(不是地板坡度),因此 muggins 的任务是证明它……平衡传感器返回(accel_t_gyro.value.z_gyro)这是由以下各项组成的联盟:
typedef union accel_t_gyro_union { struct { uint8_t x_accel_h; uint8_t x_accel_l; uint8_t y_accel_h; uint8_t y_accel_l; uint8_t z_accel_h; uint8_t z_accel_l; uint8_t t_h; uint8_t t_l; uint8_t x_gyro_h; uint8_t x_gyro_l; uint8_t y_gyro_h; uint8_t y_gyro_l; uint8_t z_gyro_h; uint8_t z_gyro_l; } reg; struct { int16_t x_accel; int16_t y_accel; int16_t z_accel; int16_t temperature; int16_t x_gyro; int16_t y_gyro; int16_t z_gyro; } value; };
例如,它给出一个四位数字 4988。 美好的。 我使用的 LCD 一次只显示一个字符,例如,如果您发送“4988”,您会得到“4”,所以我在想是否将 int 转换为 char[] 数组我可以使用 for() 来计算位置和输出
for(int a = 0; a <= 7; a++) { // char[a] to int[a] type thing } lcd.print(a);
解决方案1
在C语言中,一个字符[] 实际上是一个字符串:在末尾添加一个空值“\0”,它是一个用于所有实际目的的字符串 – 这些称为“空终止字符串”
要输出到字符串,您必须分配给 readOut[a]
而不是从中读取,并将您的值拆分为字符 – 这并不困难,但取决于输入实际存储的内容。
Google 搜索“C 将整数转换为字符串”和“C 将整数转换为十六进制字符串”以获得一些想法。
解决方案2
根据提供的数据类型,传感器将结果存储为 16 位整数中的二进制数。 第一步是找出 z_gyro 的最大值和最小值是多少。 如果是4位带符号的值,则至少需要6个字符才能转换成字符串。 如果缓冲区 readOut 声明为 8 个字节,则使用输出的字符串长度没有任何害处。
我建议首先将整数值转换为字符串。 如果您可以使用 C 命令 sprintf(),这很容易:
sprintf(readOut, "%d", sensor.value.z_gyro);
然后使用 for 循环将字符串末尾的所有字符单独传递给 print() 函数。
for (int i = 0; i < strlen(readOut); i++) lcd.print(readOut[i]);
如果 sprintf() 函数不可用, itoa() 仍然可以使用,或者您可以自己在循环中编程转换。
附加信息“sprintf,事实上所有 f 函数(打印、扫描)都不存在!” 您可以自己编写一个简单的通用函数。 它可能看起来像这样:
void intToCString(int num, char* str) { if (num < 0) { *str++ = '-'; num = -num; } int divisor = 1; while (num / divisor > 9) { divisor *= 10; } while (divisor > 0) { *str++ = '0' + (num / divisor); num %= divisor; divisor /= 10; } *str = '\0'; }
解决方案3
如果您没有 itoa,您可以使用 sprintf(),但这对于如此轻量的任务来说相当繁重。 以下内容应该适合您
int magnitude(int x) { int i; x = abs(x); for(i = 0; x > 0; x /= 10, ++i); return i; } char *i2cstr(int i, char *buff) { int n = magnitude(i); /* The following is only needed if i may be negative */ int last = 0; if(i < 0) { i *= -1; buff[0] = '-'; n += 1; last = 1; } /* end of dealing with negative numbers */ buff[n] = 0; for(--n; n >= last; --n ) { buff[n] = i%10 + '0'; i/= 10; } return buff; }
注意:参数 buff
i2cstr() 的大小必须适当。 对于 uint16_t 来说有 6 个字符,包括终止 nul。
解决方案4
如果只需要输出值,则不需要先转换为字符串。
void putaschar(int16_t n) { if( n == 0 ) { /* special case for n == 0 */ putchar('0'); } else { if(n < 0) { /* oputput sign, and make n +ve */ putchar('-'); n *= -1; } /* determine largest power of 10 smaller than n */ int16_t divisor = 10000; /* maximum power of 10 that will fit in int16 */ while( n / divisor == 0) { divisor /= 10; } /* send chars to the output device */ do { putchar(n/divisor + '0'); n %= divisor; divisor /= 10; } while(divisor > 0); } }
上式中,假设 putchar()
代表将字符发送到显示器所需的任何魔法。
[ad_2]
コメント