0

SM130 RFID リーダー用の Sparkfun のサンプル コードを、適切にカプセル化され、複数の arduino スケッチで使用できるクラス/ライブラリに変換しようとしています。

Sparkfun サンプル コード: https://github.com/sparkfun/RFID_Evaluation_Shield/blob/master/Firmware/RFID_Eval_13_56MHz.ino

ソフトウェアシリアル通信をメンバー変数にしようとするまで、ほとんどは非常にスムーズに進みました-次のようなエラーが発生し続けます。

/Users/scottnla/Dropbox/arduino/libraries/SM130/SM130.cpp: In constructor 'SM130::SM130()':
/Users/scottnla/Dropbox/arduino/libraries/SM130/SM130.cpp:8: error: no matching function for call to 'SoftwareSerial::SoftwareSerial()'
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:83: note: candidates are: SoftwareSerial::SoftwareSerial(uint8_t, uint8_t, bool)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:48: note:                 SoftwareSerial::SoftwareSerial(const SoftwareSerial&)

この問題に対処しているように見えるstackoverflowの投稿を見つけました(Arduino用のライブラリの作成)が、それらの解決策はうまくいかないようです。IDE のエラー メッセージは、コンストラクターで「ベース初期化子」しか使用できないことを示しているようです。しかし、これは私が望むものではありません。コードで発生している問題に対処する最善の方法は何ですか?

ありがとう!

以下のコード:

SM130.h

#ifndef SM130_h
#define SM130_h

#include<Arduino.h>
#include <WConstants.h>

class SM130 {
  public:
    SM130();
    void connect(int RX, int TX);
    void check_for_notag();
    void halt_tag();
    void parse_tag();
    void print_serial();
    void seek_tag();
    void set_flag();

  private:
    int rfid_flag;
    int data[11];
    SoftwareSerial rfid;
};

#endif

SM130.cpp

#include <WProgram.h>
#include <SoftwareSerial.h>
#include "SM130.h"

SM130::SM130() {
  rfid_flag = 0;
}

void SM130::connect(int RX, int TX) : rfid(RX, TX) {
 if(!Serial.available()) {
    Serial.begin(9600);
  }
  Serial.println("Connecting to SM130 RFID Reader...");
  //rfid = SoftwareSerial(RX, TX);
  rfid.begin(19200);
  if(rfid.available()) {
    rfid.println("Connected to SM130 RFID Reader!");
  }
  delay(10);
}

void SM130::check_for_notag() {
  seek_tag();
  delay(10);
  parse_tag();
  set_flag();

  if(rfid_flag == 1) {
    seek_tag();
    delay(10);
    parse_tag();
  }
}

void SM130::halt_tag() {
  rfid.write(0xFF);
  rfid.write((byte)0x00);   //manual typecasting needed for 0x00 to differentiate it from null pointer -- silly c compilers!
  rfid.write(0x01);
  rfid.write(0x93);
  rfid.write(0x94);
}

void SM130::parse_tag() {
 while(rfid.available()) {
   if(rfid.read() == 0xFF) {
     for(int i = 1; i < 11; i++) {
       data[i] = rfid.read();
     }
   }
 }
}

void SM130::print_serial() {
  if(rfid_flag == 1) {
      Serial.print(data[5],HEX);
      Serial.print(data[6],HEX);
      Serial.print(data[7],HEX);
      Serial.print(data[8],HEX);
      Serial.println();
  }
}

void SM130::seek_tag() {
  //insert hex tags here
  rfid.write(0xFF);
  rfid.write((byte)0x00); //manual typecasting needed for 0x00 to differentiate it from null pointer -- silly c compilers!
  rfid.write(0x01);
  rfid.write(0x82);
  rfid.write(0x83);
}

void SM130::set_flag() {
  if(data[2] == 6) {
    rfid_flag++;
  }
  if(data[2] == 2) {
    rfid_flag = 0;
  }
}

私のarduinoのスケッチ:

#include <SM130.h>

void read_serial();
SM130 rfidReader;

void setup() {
  //Connect to computer
  Serial.begin(9600);

  //connect to SM130
  rfidReader.connect(7,8);
}

void loop() {
  read_serial();
}

void read_serial() {
  rfidReader.seek_tag();
  delay(10);
  rfidReader.parse_tag();
  rfidReader.set_flag();
  rfidReader.print_serial();
  delay(100);
}
4

1 に答える 1

1

/Users/scottnla/Dropbox/arduino/libraries/SM130/SM130.cpp: コンストラクター 'SM130::SM130()': /Users/scottnla/Dropbox/arduino/libraries/SM130/SM130.cpp:8: エラー: いいえ「SoftwareSerial::SoftwareSerial()」を呼び出すためのマッチング関数

この部分がすべてを物語っています。SoftwareSerial には引数リストのないコンストラクタがないため、存在しない関数を呼び出そうとしています。コンストラクターの初期化リストでクラス メンバーを指定しない場合、コンパイラーは既定で () コンストラクターを呼び出します。これは以下と同等です:

SoftwareSerial ss;

クラスについて話していなければ。

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

残念ながら、SoftwareSerial には Set メソッドがありません。

http://arduino.cc/de/Reference/SoftwareSerial

しかし、心配する必要はありません。動的メモリ割り当てが役に立ちます! 例えば:

SM130.h

#ifndef SM130_h
#define SM130_h

#include<Arduino.h>
#include <WConstants.h>

class SM130 {
  public:
    SM130();
    ~SM130();
    void connect(int RX, int TX);
    void check_for_notag();
    void halt_tag();
    void parse_tag();
    void print_serial();
    void seek_tag();
    void set_flag();

  private:
    int rfid_flag;
    int data[11];
    SoftwareSerial* rfid;
};

#endif

SM130.cpp (一部のメソッドのみ)

SM130::SM130() : rfid(NULL)  {
  rfid_flag = 0;
}

void SM130::connect(int RX, int TX) {

    if(!Serial.available()) 
    {
        Serial.begin(9600);
    }

    Serial.println("Connecting to SM130 RFID Reader...");
    if (NULL != rfid)
    {
        delete rfid;
    }
    rfid = new SoftwareSerial(RX, TX)
    rfid->begin(19200);
    if(rfid->available())
    {
       rfid->println("Connected to SM130 RFID Reader!");
    }
    delay(10);
 }


 ~SM130::SM130() 
 {
     if (NULL != rfid)
     {
         delete rfid;
     }
 }

コンストラクタ、コネクト、デストラクタのバージョンのみを投稿しました(メモリリークを避けるために持っていると便利です)。

次のことを忘れないでください。

  1. rfid が NULL でないかどうかを確認します (NULL != rfidの代わりに使用rfid != NULLすることをお勧めします。コンパイラは のような間違いについて教えてくれるからですif (rfid = NULL))
  2. rfid.に変更rfid->

disconnect古い rfid を削除し、ポインターを NULL に設定するメソッドを追加することもできます。

     void SM130::disconnect() {
         delete rfid;
         rfid = NULL;
     }
于 2013-11-12T21:36:09.130 に答える