0

我尝试为 Arduino 构建一个库(file.cpp + file.h),但出现此错误:

在示例_MPL3115A2.ino:2 中包含的文件中:/Applications/Arduino.app/Contents/Resources/Java/libraries/MPL3115A2/MPL3115A2.h:8: 错误:ISO C++ 禁止声明没有类型EXAMPLE_MPL3115A2.ino 的“getPressure”:在函数 'void loop()' 中:EXAMPLE_MPL3115A2:18:错误:在 '.' 之前预期的 unqualified-id 令牌

你能解释一下错误在哪里吗?(我不太懂C++)

这是我的MPL3115A2.h

#ifndef MPL3115A2_h
#define MPL3115A2_h

#include "Arduino.h"

class MPL3115A2{
public:
  getPressure();
private:
  int m_i2c_address;
  byte _p_msb, _p_csb, _plsb;
  byte _tempp, _tempa, _tempt, _decimalPress, _decimalAlt, _decimalTemp;
  unsigned long _ptot;
};

#endif  

我的MPL3115A2.cpp

#include "Arduino.h"
#include "MPL3115A2.h"
#include "I2C.h"



MPL3115A2::MPL3115A2()
{
        m_i2c_address = 0x60;
        p_msb = _p_msb;
    p_csb = _p_csb;
    p_lsb = _p_lsb;
        tempp = _tempp;
    tempa = _tempa;
    tempt = _tempt;
    decimalPress = _decimalPress;
    decimalAlt = _decimalAlt;
    decimalTemp = _decimalTemp;
        ptot = _ptot;
}

float MPL3115A2::getPressure()
{
  I2c.write(m_i2c_address,0x26,0x00);
  I2c.write(m_i2c_address,0x26,0x01); 
  delay(100);
  I2c.read(m_i2c_address,0x1,3);
  I2c.end();
  while(I2c.available()){
  p_msb=I2c.receive(); 
  p_csb=I2c.receive(); 
  p_lsb=I2c.receive();}
    ptot=p_msb;
  ptot=(ptot<<8)+p_csb;
  ptot=(ptot<<2)+(p_lsb>>6);
  tempp=(p_lsb<<2);
  if(tempp==192){
    decimalPress=75;
  }else if(tempp==128){
    decimalPress=25;
  }else if(tempp==64){
    decimalPress=5;
  }else{tempp=0;}
  Serial.print(ptot);
  Serial.print(".");
  Serial.println(decimalPress);
}

#endif

和我的example.pde

#include <Arduino.h>
#include <MPL3115A2.h>
#include <I2C.h>

void setup(){
  Serial.begin(9600);
  I2c.begin();
}
//LOOP
void loop(){
  Serial.print("Pressure is: ");
  MPL3115A2.getPressure(); //Expressed in Pa
  Serial.print("Altimetry is: ");
  //MPL3115A2.getAltimetry(); //Expressed in m
  Serial.print("Temperature is: ");
 // MPL3115A2.getTemperature();  //Expressed in C
  delay(2000);
}

对不起,很长的帖子!感谢大家的帮助!

4

2 回答 2

2

getPressure()没有返回类型!根据您发布的 cpp,您的头文件应声明该方法,float getPressure();以便将您的头文件更改为:

#ifndef MPL3115A2_h
#define MPL3115A2_h

#include "Arduino.h"

class MPL3115A2{
public:
  float getPressure(); // <- only change here
private:
  int m_i2c_address;
  byte _p_msb, _p_csb, _plsb;
  byte _tempp, _tempa, _tempt, _decimalPress, _decimalAlt, _decimalTemp;
  unsigned long _ptot;
};

#endif 

对应的定义

float MPL3115A2::getPressure()
{
  // your processing code...
}

另外,请记住,您应该查看您的constructor,因为它没有在您的标题中声明。另外,做类似的事情

p_msb = _p_msb;
p_csb = _p_csb;
p_lsb = _p_lsb;
tempp = _tempp;
tempa = _tempa;
tempt = _tempt;
decimalPress = _decimalPress;
decimalAlt = _decimalAlt;
decimalTemp = _decimalTemp;
ptot = _ptot;

真的很奇怪。左边的变量是什么?您正在使用未初始化的成员(右侧的成员,以 开头_)初始化它们。你应该考虑给这些成员一个初始值(比如0?)

将您的构造函数更改为:

MPL3115A2::MPL3115A2()
{
    _p_msb = 0;
    _p_csb = 0;
    _p_lsb = 0;
    _tempp = 0;
    _tempa = 0;
    _tempt = 0;
    _decimalPress = 0;
    _decimalAlt = 0;
    _decimalTemp = 0;
    _ptot = 0;
}

确保您的成员变量使用“已知”值进行初始化。

此外,这些值中的大多数似乎是临时的(您可能在调用之外不需要它们getPressure()。在这种情况下,考虑将所有这些字节移动到函数的范围而不是传感器类中,以避免使用不必要的内存 - 没有在 Arduinos 上可用的东西太多了。

您还需要添加类MPL3115A2();public一部分MPL3115A2,这是因为您在 CPP 文件中为此构造函数定义了一个主体,因此您需要声明它以使其成为对象的一部分。

于 2012-11-21T13:06:01.913 回答
1

我认为该getPressure()方法应该在float您实现时使用返回类型声明MPL3115A2.cpp,因此'h文件应该具有:

...
class MPL3115A2 {
    public:
        float getPressure();
        // (and remember the constructor)
    private:    
        ...
}

另外,您是否知道该方法实际上没有return任何作用?如果是这样,您可以将其设为 avoid getPressure()并相应地更改类定义。

补充:对于未来的读者,错误消息中提供了答案,尽管隐藏在神秘的东西中:“ ...ISO C++ 禁止声明没有类型的 'getPressure' ...

希望有帮助。

于 2012-11-21T13:05:32.597 回答