-1

我对 C++ 很陌生,我想将Long变量转换为char数组,然后打印每个。

我需要转换才能在这个函数上使用它modem.write(c); c 变量是 char。我拥有的变量是long GMT = now.unixtime();

所以我想我需要先将GMT转换为 char 数组,然后modem.write在 for 循环中调用?

编辑0:

在与 H2CO3 讨论后,他向我解释说 modem.write 实际上需要一个 uint8_t 并且 vales 需要是 ASCII 码,因此在发送数据之前应该进行更详细的过程。

编辑1:

while(Serial.available()){
  char c = Serial.read();
  modem.write(c);
}

long GMT = now.unixtime();
char* newCode = totp.getCode(GMT);

编辑2:

char* buf;
snprintf(buf, sizeof buf, "%ld", GMT);
modem.write(buf);

错误:从 'char ' 到 'uint8_t' 的无效转换*

4

2 回答 2

2

免责声明:我对任何 arduino SDK 都不太了解,所以在我可以从您的问题中做出的所有假设下,这只是在纯 C 中执行此操作的一种可能的非常通用的方式。使用某种 arduino SDK 可能有更好的方法。

此外,正如已经指出的那样,modem.write 确实需要一个 char 或一个字节数组和一个 size_t 参数,所以我将这个答案留在这里,让人们学习一些不一定为此提供最佳答案的东西问题,但它本身仍然是正确的(在所述假设下)


假设 modem.write(...) 确实需要一个\0终止的 char 数组,而不是一个 c++ 字符串,这将是在 c 中执行此操作的一种可能方法:

char *c = malloc(sizeof(long) + 1);

if (!c) {
  // handle ENOMEM
}

strncpy(c, (const char *)&GMT, 4);

c[sizeof(long)] = '\0';
于 2013-10-13T19:51:06.840 回答
2

所以根据要求(如果我的假设是正确的......):

由于char是关于严格别名规则的特殊类型,您可以只获取指向第一个字节的指针long并使用如下const uint8_t *, size_t重载SoftModem::write

modem.write((const uint8_t *)&GMT, sizeof GMT);

如果要发送格式化的十进制字符串,则必须先相应地转换您的数字:

char buf[0x100];
int n = snprintf(buf, sizeof buf, "%ld", GMT);
if (n > 0) {
    modem.write((const uint8_t *)buf, n)
}

(这是因为 Arduino 库所基于的 AVR-libc 的 typedefuint8_tunsigned char如此处所示。如果uint8_t不是(有符号或无符号)字符类型,那么这将违反严格的别名规则。)

于 2013-10-13T19:54:53.313 回答