4

我写了一个库,但是有错误没有命名类型。我已经尝试了一切,搜索了几个小时,但没有运气。库放置在 arduino 草图文件夹的“库”文件夹中。请帮忙!!!我正在使用 OSX,但同样的问题也出现在 Windows 上。

这是库的头文件:

#ifndef OpticalSensor_h
#define OpticalSensor_h

#include <Arduino.h>
#include <SD.h>
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <String.h>

class OpticalSensor
{
    public:
        OpticalSensor(int analogPort);
        void LCDInit(int columns, int rows);
        void SerialInit(int bitRate);
        void SDInit();
        double& ReadFromAnalogPort();
        void SDCreateFile(String fileName);
        void SDDeleteFile(String fileName);
        void SDWriteToFile(String fileName);
        void SDStreamToFile(String Text);
        void SDOpenFileToStream(String fileName);
    private:
        int _analogPort;
        bool _displayFlag;
        Adafruit_RGBLCDShield _lcd;
        File _MainRecFile;
        double _voltage;
        void _LCDClearAll();
        void _LCDWriteInTwoRows(String row1, String row2);
        void _DelayAndClearLCD(bool returnStatus);
};

#endif

这是库的 .cpp 文件:

#include <OpticalSensor.h>

Adafruit_RGBLCDShield _lcd;
File _MainRecFile;
double _voltage;

OpticalSensor::OpticalSensor(int analogPort)
{
    _analogPort = analogPort;
}

void OpticalSensor::LCDInit(int columns, int rows)
{

    _lcd = Adafruit_RGBLCDShield();
    _lcd.begin(columns,rows);
}

void OpticalSensor::SerialInit(int bitRate)
{
    Serial.begin(bitRate);
    _bitRate = bitRate;
    while(!Serial) {
        //wait until serial is not open
    }
}

void OpticalSensor::SDInit()
{
    // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
    // Note that even if it's not used as the CS pin, the hardware SS pin
    // (10 on most Arduino boards, 53 on the Mega) must be left as an output
    // or the SD library functions will not work.
    pinMode(10, OUTPUT);

    //check if SD can be found and initialized. Print also message to
    //Serial if initialized and to _lcd if initialized.
   if(!SD.begin(4)) {
     if(Serial){
         Serial.println("Initialization failed!");
     }
     if(_lcd){
         _lcd.print("Init failed!");
     }
     _DelayAndClearLCD(true);
   }
   else {
       if(Serial) {
           Serial.println("Initialization done!");
       }
       if(_lcd) {
           lcd.print("Init done!");
       }
       _DelayAndClearLCD(false);
   }
}

void OpticalSensor::SDCreateFile(String fileName)
{
    //check if file allready exists, if not it creates one
    //and writes apropriate response to
    //lcd and Serial if they are initialized.
    if(SD.exists(fileName)) {
        if(Serial) {
            Serial.println(fileName + " already exists!");
        }
        if(_lcd) {
            _LCDWriteInTwoLines(fileName,"already exists!");
        }
        _DelayAndClearLCD(false);
    }
    else
    {
        if(Serial) {
            Serial.println(fileName + "Creating file " + fileName + "...");
        }
        if(_lcd) {
            _LCDWriteInTwoLines("Creating file", fileName);
        }
        _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
        _MainRecFile.close();
        _DelayAndClearLCD(false);


        //check if file was created successffully and print apropriate response
        //to lcd and Serial if they are initialized
        if(SD.exists(fileName + ".txt")) {
            if(Serial) {
                Serial.println(fileName + ".txt" + " created successffully!");
            }
            if(_lcd) {
                _LCDWriteInTwoLines(fileName + ".txt", "created!");
            }
            _DelayAndClearLCD(false);
        }
        else {
            if(Serial) {
                Serial.println("error: failed to create file!");
            }
            if(_lcd) {
                _LCDWriteInTwoLines("error: failed to","create file!");
            }
            _DelayAndClearLCD(false);
        }
    }
}

//delete file from SD card
void OpticalSensor::SDDeleteFile(String fileName)
{

}

//open file, write data to it, and close file after.
void OpticalSensor::SDWriteToFile(String fileName, String Text)
{
    _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
    _MainRecFile.println(Text);
    _MainRecFile.close();
}

//Open file to stream data to it.
void OpticalSensor::SDOpenFileToStream(String fileName)
{
    _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
}

//Write data to file while file is open.
//Notice that you can stream data only to one file at a time!!!
//For instance, if you have two sensors that you want to
//write data to two different files, you have to use SDWriteToFile
//function!!!
void OpticalSensor::SDStreamToFile(String Text)
{
    if(_MainRecFile) {
        _MainRecFile.println(Text);
    }
}

//close file that you streamed data too.
void OpticalSensor::SDCloseStreaming(String fileName)
{
    _MainRecFile.close();
}

//clear entire LCD
void OpticalSensor::_LCDClearAll()
{
    _lcd.clear();
    _lcd.setCursor(0,0);
}

void OpticalSensor::_LCDWriteInTwoRows(String row1, String row2)
{
    //write first String in row1
    _lcd.print(row1);
    //set cursor to the beginning of row 2
    _lcd.setCursor(0,1);
    //write second String to row 2
    _lcd.print(row2);
}

void OpticalSensor::_DelayAndClearLCD(bool returnStatus)
{
    //if Serial or _lcd are initialized, delay for 2 seconds
    //and clear LCD
    if(Serial || _lcd) {
        delay(2000);
        if(_lcd)
            _LCDClearAll();
    }
    //terminate
    if(bool == true) {
        return;
    }
}

double& ReadFromAnalogPort()
{
    _voltage = analogRead(_analogPort);
    return _voltage;
}

这是包含库的 .ino 文件:

#include <OpticalSensor.h>

OpticalSensor sensor(0);

void setup() {
  sensor.LCDInit(16,2);
  sensor.SerialInit(9600);
  sensor.SDInit();
  sensor.SDCreateFile("test1");
  sensor.SDOpenFileToStream("test1");
}

void loop() {

}

这是错误:

在 Test_OpticalSensorLib.ino:1 包含的文件中:/Users/gaspersladic/Documents/Arduino/libraries/OpticalSensor/OpticalSensor.h:34: 错误:'Adafruit_RGBLCDShield' 没有命名类型 /Users/gaspersladic/Documents/Arduino/libraries/ OpticalSensor/OpticalSensor.h:35:错误:“文件”未命名类型

4

8 回答 8

10

您在评论中提到的这两个是必不可少的。“不命名类型”仅表示该标识符没有对编译器可见的定义。如果您提到的 LCD 库中有错误,则需要解决这些错误 - 省略 #include 肯定不会修复它!

经验中的两点可能会有所帮助:

  1. 您需要将所有#include 添加到主草图 - 无论它们是否通过另一个#include 包含在内。

  2. 如果您将文件添加到库文件夹,则必须重新启动 Arduino IDE,然后才能看到这些新文件。

于 2013-09-07T19:38:08.057 回答
2

does not name a type安装 NeoMatrix 库时出现错误。

解决方法:.cpp.h文件复制时需要在顶层文件夹中,例如:

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

当我使用默认的 Windows 解压缩程序时,它会将内容嵌套在另一个文件夹中:

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

我把文件上移了,所以它是:

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

这解决了does not name a type问题。

于 2014-01-05T07:52:34.793 回答
1

我在“}”中找到了这个问题的解决方案。我对我的草图做了一些更改,忘记检查“}”,我有一个额外的。一旦我删除它并编译一切都很好。

于 2020-01-29T16:52:20.253 回答
0

您唯一需要做的就是将这条线添加到您的草图中

#include <SPI.h>

之前#include <Adafruit_MAX31855.h>

于 2014-09-04T07:47:03.577 回答
0

不知道这是你的问题,但这是我的问题。

void setup() 没有命名类型

void setup() 没问题。

我发现我为另一个项目复制的草图充满了“错误大小写”的字母。安装好后,运行流畅。强调文本

于 2014-02-14T19:35:49.510 回答
0

最近,我发现其他因素也会导致此错误。我有一个 AES.h,AES.cpp 包含一个 AES 类,它给出了同样无用的错误。只有当我重命名为 Encryption.h、Encryption.cpp 和 Encryption 作为类名时,它才突然开始工作。没有其他代码更改。

于 2017-05-29T20:13:47.420 回答
0

我的代码在 Arduino 中没有 void setup() 或 void loop()。

于 2020-01-24T23:18:48.843 回答
-1

通常头文件语法以大写字母开头。我发现代码都是用小写字母写的

#ifndef DIAG_H
#define DIAG_H

#endif
于 2014-02-15T08:54:55.267 回答