char变量的长变量

时间:2013-10-13 19:46:03

标签: c++ c arduino

我是C ++的新手,我想将 Long 变量转换为 char 数组,然后打印每一个。

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

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

EDIT0:

在与H2CO3讨论后,他向我解释说,modem.write实际上是在期待uint8_t,而vales需要是ASCII码,因此在发送数据之前应该进行更详细的处理。

EDIT1:

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”*

2 个答案:

答案 0 :(得分:2)

免责声明:我对任何arduino SDK都知之甚少,所以在我可以根据你的问题做出的所有假设中,这只是一种非常通用的方法。使用某种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';

答案 1 :(得分: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,typedef uint8_tunsigned charas seen here。如果uint8_t不是一个(有符号或无符号)字符类型,这将违反严格的别名规则。)