Как исправить ошибку "invalid operands of types 'const char [17]' and 'float' to binary 'operator+'"?

mpu6050 error
#include <Wire.h>

long aX,aY,aZ,gX,gY,gZ;
float rtX,rtY,rtZ,gfX,gfY,gfZ;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  setupMPU ();
}

void loop()
{
  recordAccelregisters();
  recordGyroregisters();
  printData();
  delay(100);
}

void setupMPU()
{

  Wire.beginTransmission(0b1101000);
  Wire.write(0x6B);
  Wire.write(0b00000000);
  Wire.endTransmission();
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1B);
  Wire.write(0b00000000);
  Wire.endTransmission();
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1C);
  Wire.write(0b00000000);
  Wire.endTransmission();
}



void recordAccelregisters()
{
  Wire.beginTransmission(0b1101000);
  Wire.write(0x3B);
  Wire.endTransmission();
  Wire.requestFrom(0b1101000,6);
  while(Wire.available()<6)
  {
    aX = Wire.read()<<8|Wire.read();
    aY= Wire.read()<<8|Wire.read();
    aZ = Wire.read()<<8|Wire.read();
    processAData();
  }
}

void processAData()
{
  gfX= aX/16384.0;
  gfY = aY/16384.0;
  gfZ = aZ/16384.0;
}

void recordGyroregisters()
{
  Wire.beginTransmission(0b1101000);
  Wire.write(0x43);
  Wire.endTransmission();
  Wire.requestFrom(0b110100,6);
  while(Wire.available()>6)
  {
    gX = Wire.read()<<8|Wire.read();
    gY = Wire.read()<<8|Wire.read();
    gZ = Wire.read()<<8|Wire.read();
    processGdata();
  }

}


void processGdata()
{
  rtX= gX/131.0;
  rtY = gY/131.0;
  rtZ= gZ /131.0;
}

void printData()
{
  Serial.print("Gyro degree(x)= "+ rtX + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
  Serial.print("Gyro degree(y)= "+ rtY + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
  Serial.print("Gyro degree(z)= "+ rtZ + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
  Serial.print("Accel Gforce(x)= "+ gfX + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
  Serial.print("Accel Gforce(y)= "+ gfY + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
  Serial.print("Accel Gforce(z)= "+ gfZ + " ");// эта строка показывает ошибку, упомянутую выше в вопросе
}

это код mpu6050. Почему я получаю эту ошибку и как ее устранить?

, 👍0

Обсуждение

Примечание: вы не должны писать Wire.read()<<8|Wire.read(), потому что [порядок оценки вызовов Wire.read() не указан](https://en. cppreference.com/w/cpp/language/eval_order). См. также [эту тему на форуме Arduino](https://forum.arduino.cc/index.php?topic=659333.msg4443224#msg4443224). Вместо этого используйте gX=Wire.read()<<8;gX|=Wire.read();., @Edgar Bonet


1 ответ


3

Эти строки дают вам ошибки, потому что вы не можете просто добавлять массивы символов (также известные как c-строки) и числа с плавающей запятой вместе с оператором +. C/C++ очень строг в отношении типов переменных. Компилятор не знает, как он должен складывать эти типы вместе.

В других языках высокого уровня строковые литералы (символы, заключенные в " в исходном коде) являются более сложными типами, чем c-строки. Они в основном имеют различные методы, а также реализацию Оператор + для добавления числа с плавающей запятой в удобочитаемой форме. Этот сложный тип в мире Arduino — тип String. Вы можете преобразовать переменную с плавающей запятой в String , а затем сложите их вместе. Но это не тот способ, которым вы должны это делать. Строки на Arduino на базе AVR (например, Uno, Nano, ...) могут быть очень злыми из-за ограниченного ОЗУ. См. Блог Маженко. запись о Зла строк Arduino для получения дополнительной информации.

Вместо этого вы должны просто использовать несколько операторов печати. Поскольку последовательные данные отправляются последовательно (один байт за другим), не имеет значения, поместите ли вы все данные для отправки в один оператор печати или несколько раз. Таким образом, каждую ошибочную строку можно преобразовать во что-то вроде этого:

Serial.print("Gyro degree(x)= ");
Serial.print(rtX);
Serial.print(" ");

Он делает именно то, что делает ваш код. Но это не приведет к ошибке, так как метод Serial.print() также реализован для использования аргументов типа float.

,