繁体   English   中英

C ++字符串数组在20字节后拆分

[英]C++ string array split after 20 Bytes

我有这个代码示例,用于制作最终将通过BLE发送的20字节大小的数据包。 我想更改代码,以便输入我的数据数组(加速度计读数)。

我的数据:

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文件中。(每列=不同的数据)。

谢谢!

String类提供了一个构造函数,它接受输入const char *,因此您可以使用它将您的变量命名数据(隐式或显式)转换为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_s改变sprintf,它更安全

字符串引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM