0

我有一个项目,这个项目完全依赖于 Arduino Due 和 Nano 33 BLE 之间的通信。
我想通过 UART 从位于 Nano 中的传感器作为浮点数据发送数据,并且我也以浮点的形式接收它。
但是使用Serial.read(),数据将作为 int 发送,使用Parsefloat,信息接收不正确。
有没有办法将传感器数据从 nano 发送到 Due 而不会出错?并以正确的形式?

这是纳米代码:


float h = 22.5;
float x, y, z;
int i = 0;
unsigned long previousMillis = 0;

const long interval = 500;
void TimerOhne();
void Acceleration();
void setup()
{
    Serial.begin(9600);
    Serial1.begin(9600);
    if (!IMU.begin())
    {
        Serial.println("Failed to initialize IMU!");
        while (1)
            ;
    }
    Serial.println("Read the serial");
}

void loop()
{

    // TimerOhne();
    Acceleration();
}

void TimerOhne()
{
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval)
    {
        // save the last time you blinked the LED
        previousMillis = currentMillis;
        Serial1.write(h);
        Serial.println(h);
        Serial.println();
        Serial.print("i ist: ");
        Serial.print(i);
        Serial1.write(66);
        Serial1.write(i);
        Serial.println();
        i++;
    }
}

void Acceleration()
{
    if (IMU.accelerationAvailable())
    {
        IMU.readAcceleration(x, y, z);
    }
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval)
    {
        
        x = x * 100;
        y = y * 100;

        Serial1.write(4);
        Serial1.write(x);
        Serial1.write(6);
        Serial1.write(y);
        Serial1.write(8);
        Serial1.write(i);
        i++;
        Serial.print("X ist:  ");
        Serial.println(x);
        Serial.print("y ist:  ");
        Serial.println(y);
    }
}

这是到期代码

float r;
unsigned long previousMillis = 0;
const long interval = 500;

void setup()
{
  // Begin the Serial at 9600 Baud
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
   
    r = Serial1.read();
   
    Serial.println(r);
  }
}
4

1 回答 1

0

要传输float二进制文件,您必须将浮点数的字节作为字节数组发送。

Serial1.write((const uint8_t*) &x, sizeof(x));

您可以将它们接收为

if (Serial1.available()) {
  Serial1.readBytes((uint8_t*) &x, sizeof(x));
  ...
}

注意:这假设浮点类型在两侧的编码方式相同,这是正确的,因为两个 MCU 都是 ARM 架构。


如果您想将数字作为文本传输并在另一个 Arduino 上解析,请使用Serial1.print(x)发送它,您可以使用 parseFloat() 函数。

if (Serial1.available()) {
  x = Serial1.parseFloat();
  ...
}
于 2021-11-28T14:28:21.043 回答