2

我之前问过类似的问题,但答案并不完全是我想要的,所以这次我将提供更多细节。

我是第一次使用 C 语言对微控制器进行编程。我有一个 Android APP,允许用户选择颜色组合(RGB 颜色),然后将颜色代码发送到微控制器。微控制器根据选择的内容显示灯光。

我试图做的是能够一次读取四位数的数字。因此,如果发送的号码是 2005001000200,我想执行以下操作。

提取第一个数字并将其保存在名为 mode 的变量中..然后..提取接下来的四位数字并将它们保存在名为 red 的变量中..然后...提取接下来的四位数字并将它们保存在名为 green 的变量中。 .然后.. 提取最后四位数字并将它们保存在一个名为 blue 的变量中。所以输出应该是这样的......

模式 = 2

红色 = 0050

绿色 = 0100

蓝色 = 0200

如果我能看到一个说明我正在尝试做的事情的例子,那就太棒了。请记住,我是第一次对微控制器进行编程。太感谢了!

4

3 回答 3

7

假设我2005001000200ULLunsigned long long某个地方:

unsigned long long value = 2005001000200ULL;

如果我想提取blue,我会使用模运算:

unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000;

要提取绿色,我会使用除法运算,然后是相同的模运算:

unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000; value /= 10000;
unsigned int green = value % 10000;

要提取红色,请重复该过程:

...

unsigned long long value = 2005001000200ULL;
unsigned int blue = value % 10000; value /= 10000;
unsigned int green = value % 10000; value /= 10000;
unsigned int red = value % 10000; value /= 10000;
unsigned int mode = value;

嘿!我错过了一步!:(

于 2013-05-02T03:14:10.170 回答
5

如果发送数字的格式是固定的,那么如果您是从键盘读取,则可以使用以下逻辑:

  scanf("%1d%4d%4d%4d",&mode,&red,&green,&blue);

这样就可以了。

否则,如果它在文件中,请使用fscanf()它。我相信 usingfscanf()对您来说是众所周知的。

而当我们这样做时,如果该数字是一个字符串,那么您可以简单地使用sscanf()类似的格式说明符字符串。

完整的使用示例:

double input = 2005001000200;
char buffer[14];
sprintf(buffer, "%f", input);
int mode, red, green, blue;
sscanf(buffer, "%1d%4d%4d%4d",&mode,&red,&green,&blue);
于 2013-05-02T03:07:31.447 回答
1

假设您存储的值是一个字符串s,您可以执行以下操作:

int mode, r, g, b, n;

if((4 == sscanf(s, "%1d%4o%4o%4o%n", &mode, &r, &g, &b, &n)) && (13 == n)) {
    // Correctly scanned mode, red, green, and blue
    // Do what you need to do...
} else {
    // Failed to scan
    // Handle error...
}
于 2013-05-02T03:41:57.390 回答