gpt4 book ai didi

arduino - 如何向 I2C 主机发送多个 32 字节字符串?

转载 作者:行者123 更新时间:2023-12-04 17:53:25 27 4
gpt4 key购买 nike

我有多个可变长度字符串,每个字符串不超过 32 个字节,需要通过 I2C 在 2 个 Arduino Nano 之间发送。我使用 # 来终止每个字符串。我可以成功发送和接收第一个字符串,但对于我的生活,我无法弄清楚如何发送后续字符串。我正在测试的样本如下所示:

    String answer = "12345,123.4,50.6,12345#";
String answerV = "4.10,4.15,4.13,4.05,4.18,0#";

主码

    #include <Wire.h> 
int esc = 0;
int throttle = 80;

void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("I2C Master ready!");
esc = throttle * 100 / 180;
}

void loop() {
delay(500);
Serial.println("Receive data");
Wire.requestFrom(9,32);
String response = "";
Serial.println(Wire.available());
while (Wire.available())
{
char b = Wire.read();
response += b;
}
String dataString = response;
int hashIndex = dataString.indexOf('#');
String SportData = dataString.substring(0, hashIndex);
Serial.println(SportData);

String SDdata = String (esc) + "," + String(SportData);
Serial.println(SDdata);
}

从代码

    #include <Wire.h>

byte ANSWERSIZE= 22;

String answer = "12345,123.4,50.6,12345#";
String answerV = "4.10,4.15,4.13,4.05,4.18,0#";

void setup() {
Wire.begin(9);
Wire.onRequest(requestEvent); // data request from Master
Serial.begin(115200);
Serial.println("I2C Slave ready!");
ANSWERSIZE = answer.length();
}

void requestEvent() {
byte response[ANSWERSIZE];
for (byte i=0;i<ANSWERSIZE;i++)
{
response[i] = (byte)answer.charAt(i);
}
Wire.write(response,sizeof(response));
}

void loop() {
delay(50);
}

有人可以告诉我如何做到这一点吗?

最佳答案

一个简单的想法是跟踪 requestEvent() 被调用的次数,并使用它来决定将什么发送回 ma​​ster


这是代码(注意,我冒昧地对其进行了一些优化):

大师:

#include <Wire.h> 

/**
* globals
*/

int esc = 0;
int throttle = 80;
char i2c_buffer[33];

/**
* setup & loop
*/

void setup()
{
Serial.begin(115200);
Wire.begin();

esc = throttle * 100 / 180;
i2c_buffer[32] = '\0';

Serial.println("I2C Master ready!");
}

void loop()
{
delay(500);

Wire.requestFrom(9, 32);

for (byte i = 0; i < 32 && Wire.available(); ++i)
{
i2c_buffer[i] = Wire.read();

if (i2c_buffer[i] == '#') {
i2c_buffer[i] = '\0';
break;
}
}

Serial.print(esc);
Serial.print(',');
Serial.println(i2c_buffer);
}

奴隶:

#include <Wire.h>

/**
* globals
*/

const byte DATA_SIZE = 2;
String data[DATA_SIZE] = {
"12345,123.4,50.6,12345#",
"4.10,4.15,4.13,4.05,4.18,0#"
};

/**
* setup & loop
*/

void setup()
{
Serial.begin(115200);
Wire.begin(9);
Wire.onRequest(requestEvent); // data request from Master

Serial.println("I2C Slave ready!");
}

void loop()
{
delay(50);
}

/**
* help functions
*/

void requestEvent()
{
static byte req_number = 0;

Wire.write(reinterpret_cast<const unsigned char*>(data[req_number].c_str()),
data[req_number].length());

req_number = (req_number + 1) % DATA_SIZE;
}

注意:我没有两个 Arduino 设备,所以我无法测试这段代码。如果您发现一些错误,请反馈,我会修复它们。

关于arduino - 如何向 I2C 主机发送多个 32 字节字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42458245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com