C ++ строковый массив разбит после 20 байт - PullRequest
0 голосов
/ 07 июня 2019

У меня есть этот пример кода, который используется для создания пакетов данных размером 20 байт, которые в конечном итоге будут отправлены через BLE.Я хочу изменить код, чтобы я мог вводить массив моих данных (показания акселерометра).

Мои данные:

float ax, ay, az, gx, gy, gz, mx, my, mz, yaw, pitch, roll;
char myConcatenation[80];
sprintf(myConcatenation, "%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f", ax,  ay, az, gx, gy, gz, mx, my, mz, yaw, pitch, roll);

Определение функции:

std::vector<std::string> buildPackets(std::string data, size_t packetSize) {
  // split up the packet
  size_t partialPacketSize = packetSize - 4;

  // calculate how many packets
  size_t packetCount = data.length() / partialPacketSize;
  packetCount = data.length() % partialPacketSize == 0 ? packetCount : packetCount + 1;

  std::vector<std::string> packets;
  // construct each packet
  for (int i = 0; i < packetCount; i++) {
    // start of packet
    std::string packet = "##";
    packet += (char)packetCount;
    packet += (char)(i + 1);
    std::string part = i == packetCount - 1 ? data.substr(i * partialPacketSize) : data.substr(i * partialPacketSize, partialPacketSize);
    packet.append(part);

    // add to vector of packets
    packets.push_back(packet);
  }

Вызов функции: переменная data здесь строка, все, что мне нужно, это поместить мой myConcatenation[]

Какие изменения я должен внести в код, чтобы он работал?

   std::string data = "averylongstringofdatathatislargerthantwentycharacters";
size_t chars = data.length();
size_t packetSize = 20;

// assume I have this characteristic already setup
if (chars > packetSize) {
  auto packets = buildPackets(data, packetSize);
  for (auto packet : packets) {
    txCharacteristic->setValue(packet);
    txCharacteristic->notify();
  }
}
else {
  txCharacteristic->setValue(data);
  txCharacteristic->notify();
}

Спасибо за любую помощь.


РЕДАКТИРОВАТЬ:

this is what I have now: 

std::vector<std::string> buildPackets(std::string data, size_t packetSize) {
  // split up the packet
  size_t partialPacketSize = packetSize - 4;

  // calculate how many packets
  size_t packetCount = data.length() / partialPacketSize;
  packetCount = data.length() % partialPacketSize == 0 ? packetCount : packetCount + 1;

  std::vector<std::string> packets;
  // construct each packet
  for (int i = 0; i < packetCount; i++) {
    // start of packet
    std::string packet = "@";
    packet += (char)packetCount;
    packet += (char)(i + 1);
    std::string part = i == packetCount - 1 ? data.substr(i * partialPacketSize) : data.substr(i * partialPacketSize, partialPacketSize);
    packet.append(part);

    // add to vector of packets
    packets.push_back(packet);
  }

  return packets;
}


--------
**call function**

sprintf(myConcatenation, "#%3.2f,%3.2f,%3.2f,#%3.2f,%3.2f,%3.2f,#%3.2f,%3.2f,%3.2f,#%3.2f,%3.2f,%3.2f", ax,  ay, az, gx, gy, gz, mx, my, mz, yaw, pitch, roll);

size_t packetSize = 20;

auto packets = buildPackets(myConcatenation, packetSize);
  for (auto packet : packets) {
    pCharacteristic->setValue(packet);
    pCharacteristic->notify();
  }

  Serial.println(myConcatenation);

Могу ли я спросить вас о принимающей стороне?моя строка имеет # в начале каждого различного показания датчика (# ax, ay, az, # gx, gy ...) и @ в начале каждого пакета.Знаете ли вы, как должна быть реализована принимающая сторона (я делаю это в MITAppInventor, но я не могу придумать идею, как соединить пакеты по порядку и добавить их в файл .csv. (Каждый столбец = разные данные).

Спасибо!

1 Ответ

0 голосов
/ 07 июня 2019

Класс String предоставляет конструктор, который принимает на вход const char *, так что вы можете использовать его для преобразования (неявно или явно) вашей переменной с именем data в std :: string.

Итак, в концепросто передайте его функции

float ax, ay, az, gx, gy, gz, mx, my, mz, yaw, pitch, roll; char myConcatenation[80]; sprintf(myConcatenation, "%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f,%3.2f", ax, ay, az, gx, gy, gz, mx, my, mz, yaw, pitch, roll); auto packets = buildPackets(myConcatenation, packetSize);

Вот и все.

Небольшое дополнительное предложение:

  • измените sprintf с помощью sprintf_s,это безопаснее

ссылка на строку

...