我正在做一个项目,我想从一个Arduino向另一个Arduino发送三个浮点值,并将这些浮点值存储在接收Arduino的数组中。打印接收到的浮点值时,我只能在串行监视器中看到前两位数。
我是初学者,不知道如何获得整个浮动值。请帮我解决这个问题。在这里,我发布了发射器和接收器代码。 发射机代码:
float transmit[3]={72.453444,83.345678,60}; //Values to be sent
void setup()
{
Serial.begin(115200);
int i;
for(i=0;i<3;i++)
{
Serial.write(transmit[i]);
}
}
void loop()
{
}
Receiver’s Code:
float received[3]; //create an float array
int i;
void setup()
{
Serial.begin(115200);
}
void loop()
{
while(Serial.available()>0)
{
for(i=0;i<=2;i++)
{
received[i]=(Serial.read());
delay(10);
}
Serial.println(received[0]);
Serial.println(received[1]);
Serial.println(received[2]);
}
}
Values received on Serial Monitor: 72 83 60
提前致谢。
答案 0 :(得分:0)
你没有看到前两位数字;你正在看到它的整数部分。这是因为Serial.Write接受整数值,因此您的浮点数将转换为int(即截断)然后发送。
如果你想“按原样”传递它们,你可以先将值的数组转换为字节数组,然后将其发送为“raw”;当你收到你只需要收到所有的字节和...你就完成了。这是代码:
发件人代码:
float transmit[3]={72.453444,83.345678,60}; //Values to be sent
void setup()
{
Serial.begin(115200);
Serial.write((uint8_t*)transmit, 3 * sizeof(float));
}
void loop()
{
}
接收人代码:
float received[3]; //create an float array
int i;
void setup()
{
Serial.begin(115200);
}
void loop()
{
if (Serial.available() >= 3 * sizeof(float));
{
uint8_t *recv_bytes = (uint8_t*)transmit;
for(i=0; i < 3 * sizeof(float); i++)
{
recv_bytes[i] = Serial.read();
}
Serial.println(received[0]);
Serial.println(received[1]);
Serial.println(received[2]);
}
}
注1:我没有对此进行过测试,因此可能存在错误。试试,如果不起作用,我们会再次查看
注2:这应该有效,但是你会在“现实生活中”遇到很多问题,因为你没有办法检测传输中的起点和终点。为了实现强大的通信,请考虑添加字节转义或保留一些信息交换等内容
注3:这仅适用于具有相同浮点数和相同字节序的系统(例如,在两个arduinos之间)。当与其他系统(例如PC或移动设备或谁知道)连接时,您将需要明确地转换数字,因为字节顺序或浮动长度不匹配使得使用我使用的自动转换无法进行通信