【发布时间】:2020-01-22 20:32:05
【问题描述】:
我有十六进制值 ex。 0300E0678C,我将它转换为 long long int 12899608460 但在这个阶段我必须只打印来自 long long int - 9608460 的最后 7 个数字,所以我尝试使用 %lld 进行 sprintf 但它什么也不返回。 有什么想法吗?
#include <SoftwareSerial.h>
#include <ID20Reader.h>
#include <PriUint64.h>
int rx_pin = 3;
int tx_pin = 2;
char output[16];
long long int numer;
char buf[50];
ID20Reader rfid(rx_pin, tx_pin);
void setup() {
Serial.begin(9600);
tone(4, 3400, 1000);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
rfid.read();
if(rfid.available())
{
digitalWrite(LED_BUILTIN, HIGH);
String code = rfid.get();
Serial.println(code);
tone(4, 4000, 500);
char bufor[12];
code.toCharArray(bufor,12);
Serial.println(bufor);
numer = hexToDec(bufor);
Serial.println(PriUint64<DEC>(numer));
delay(500);
digitalWrite(LED_BUILTIN, LOW);
}
}
long long hexToDec(String hexString) {
long long decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
【问题讨论】:
-
在 avr-gcc 文档中,您可以找到“
the ll length modifier will to abort the output, as this realization does not operate long long arguments.”“microchip.com/webdoc/AVRLibcReferenceManual/…”(顺便说一句,您为什么要进行这种奇怪的转换?) -
我从阅读器那里得到 HEX,但在 arduino 旁边我有其他设备,它只需要从十六进制转换而来的 DEC 的最后 7 位数字。
-
运气不好。您需要 all 输入文本中的十六进制数字来提取最后七个十进制数字,因此 uint64_t 是正确的中间二进制数据类型,不幸的是 avr-gcc sprintf 不支持。 (如果您使用真正的 Arduino)