[英]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);
就這樣。
一個快速的額外建議:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.