PCからAuduinoを通して,Roombaを自由に操作するプログラムを作成しています.
参考にしているサイトはこちらです.
ArduinoからRoombaをSoftware Serialで動かす
ArduinoとRoomba間のシリアル通信プログラムを作成し,次にPC(C++)とArduino間のシリアル通信プログラムを作成しました.
実行させたところ問題なく動いています.
しかし,いつも作業しているPCから,別のPCにArduinoのスケッチファイルを持ってくると,
XXX was not declared in this scope
というコンパイルエラーが発生します.(XXXは関数名)
実行させているソースは以下です.
#include <SoftwareSerial.h> SoftwareSerial device(10, 11); void setup(){ Serial.begin(9600); device.begin(115200); } void loop(){ if(Serial.available() > 0){ int cmd = Serial.read(); switch(cmd){ case 244: motor (-64,-64);break; case 255: motor( 0, 0); break; default: motor( 0, 0); break; } } } void motor(int l, int r){ byte buffer[] = { byte(128), // Start byte(132), // FULL byte(146), // Drive PWM byte(r>>8), byte(r), byte(l>>8), byte(l) }; device.write(buffer, 7); }
片方のPCでは全く問題なくコンパイルが通るのに,もう1つの別のPCでコンパイルを通そうとすると,
'motor' was not declared in this scope
というコンパイルエラーがでてしまいます.
自分で調べてみた結果,どうやら関数を見つけれていないみたいなのですが,修正方法が分かりません.
どのようにしたら直るのでしょうか.
開発環境(Arduino IDE)のバージョンが2台のPCで違っているのではないですか?
共に1.6.12を使用しています.
関数名のXXXは毎回同じでしょうか、motor以外のときもあるのでしょうか。
試しにmotorからfuncに変更してみたのですが,解決しませんでした.
loop関数とmotor関数の順番を入れ替えても同じですか。今の順番だと、motor関数を宣言・定義しないうちにloop関数の中で使っていることになっていますが。
Masahiko Hirataさんの回答をもとにloop関数とmotor関数の順番を入れ替えるとコンパイルが通りました.しかし,別のIDE環境ではコンパイルが通りますし,Arduinoのリファレンスによると関数の宣言はloop関数の前後とちらでもいいと書いてあるので,原因が不明です.
うん。でも宣言を順序通りにするとなぜかうまくいきます。
Arduinoではよくあることなのでしょうか.
というか、「関数の宣言はその関数の呼び出しがあるよりも前にすませておく」というほうが普通です。ヘッダファイルのインクルードはソースファイルの最初でやるでしょう? それと同じ。
初めて勉強した言語がC言語だったため,それのプロトタイプ宣言の癖があるから後ろに書いてしまっていました.今後はできるだけ前のほうに書くようにしてみます.
回答1件
あなたの回答
tips
プレビュー