需要加倍sprintf格式并返回太长的字符串

时间:2018-04-30 09:25:12

标签: c++ arduino

(这是来自https://forum.arduino.cc/index.php?topic=544603.msg3711704

的修改后的粘贴

首先,这是我的代码:

//#include <RCSwitch.h>
#include <EEPROM.h>

#define deviceSerial 1

//RCSwitch mySwitch = RCSwitch();

int button1 = PB2;
int button2 = PB1;
int button3 = PB0;

int radio = PB3;
int keepalive = PB4;

int i = 0;

unsigned long long intToBin(unsigned int k) {
    return (k == 0 || k == 1 ? k : ((k % 2) + 10 * intToBin(k / 2)));
}

unsigned int nextCode(){
  // Get current occurrence
  int occurrence = getOccurrence();
  // Increment occurrence
  // Commented out to preserve EEPROM at the moment
  //incrementOccurrence();
  *censored code*
  return *censored code but returns an int*
}

int getOccurrence(){
  return (EEPROM.read(0) + EEPROM.read(1) + EEPROM.read(2) + EEPROM.read(3));
}

void incrementOccurrence(){
  int occurrence = getOccurrence() + 1;
  if(occurrence >= 1020){
    //reset
    EEPROM.write(0, 1);
    EEPROM.write(1, 0);
    EEPROM.write(2, 0);
    EEPROM.write(3, 0);
  }
  else if (occurrence >= 765){
    EEPROM.write(0, 255);
    EEPROM.write(1, 255);
    EEPROM.write(2, 255);
    EEPROM.write(3, occurrence - 765);
  }
  else if (occurrence >= 510){
    EEPROM.write(0, 255);
    EEPROM.write(1, 255);
    EEPROM.write(2, occurrence - 510);
    EEPROM.write(3, 0);
  }
  else if (occurrence >= 255){
    EEPROM.write(0, 255);
    EEPROM.write(1, occurrence - 255);
    EEPROM.write(2, 0);
    EEPROM.write(3, 0);
  }
  else {
    EEPROM.write(0, occurrence);
    EEPROM.write(1, 0);
    EEPROM.write(2, 0);
    EEPROM.write(3, 0);
  }
}

void transmit(int button){
  char message[33];
  sprintf(message, "%014lu%lu%016lu%lu%02lu", intToBin(deviceSerial), intToBin(nextCode()), intToBin(button)); <---------------
  //mySwitch.send(message);
}

void setup() {
  pinMode(keepalive, OUTPUT);
  digitalWrite(keepalive, HIGH);

  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);

  //mySwitch.enableTransmit(radio);

  if(digitalRead(button1) == 1){
    transmit(1);
  }
  if(digitalRead(button2) == 1){
    transmit(2);
  }
  if(digitalRead(button3) == 1){
    transmit(3);
  }

  // Self shutdown
  digitalWrite(PB4, LOW);
}

void loop() {
}

目前输出(分隔值):

0000000000000100000001011010010010 (00000000000001 0000000101101001 0010)

应该在哪里(分隔值):

00000000000001000000010110100110 (00000000000001 0000000101101001 10)

我的问题在于我正在尝试检索所有变量以发送消息。

  • 为什么我需要加倍%lu
  • 当我声明33(32 + \ 0)时输出字符串是34个字符怎么样?最后一个长度是4而不是两个(0010而不是10)

奇怪的是:

sprintf(message, "%016lu", intToBin(nextCode())); // Works correctly
sprintf(message, "%014lu", intToBin(deviceSerial)); // Works correctly
sprintf(message, "%02lu", intToBin(button)); //Works correctly

1 个答案:

答案 0 :(得分:0)

您的功能是

unsigned long long intToBin(unsigned int k)

但您的格式说明符为%lu。虚拟%lu&#34;工作&#34;通过对齐数据。

请使用正确的格式说明符%llu

编辑: %llu不受支持。您成功使用了:

sprintf(message, "%016lu", intToBin(nextCode())); // Works correctly
sprintf(message, "%014lu", intToBin(deviceSerial)); // Works correctly
sprintf(message, "%02lu", intToBin(button)); //Works correctly

建立message的建议修复:

int len;
len  = sprintf(message,       "%016lu", intToBin(nextCode()));
len += sprintf(message + len, "%014lu", intToBin(deviceSerial));
       sprintf(message + len, "%02lu",  intToBin(button));
相关问题