ハードウェア シリアル経由で arduino と通信するグラフィカル LCD 用に作成したライブラリの一部の関数で、非常に奇妙な問題が発生しています。これは、画面が使用するシリアル プロトコルの単純なラッパーです。
基本的に、このライブラリから特定の関数を呼び出すたびに、「...への未定義の参照」エラーが発生します。ただし、他の関数は正常に動作し、動作している関数と動作していない関数の構文上の違いはわかりません。
たとえば、ボックス機能があります。私がそれを呼び出して、期待している4つの整数を与えると、正常に動作します。fill_box
、 、 、 もcircle
同様ですerase_box
。
しかし、そのような関数、backlight
またはoffset
呼び出された関数でさえarg
(当時の私が感じた方法を反映するために...)、コードが未定義の参照をトリガーします。理由がわかりません...私の間違いは何ですか?
正常に動作するコードの例を次に示します。
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
}
void loop(){delay(1000);}
しかし、次のようなものを追加するとすぐにobj.line
、このように
#include <gLCD.h>
gLCD obj = gLCD();
void setup(){
obj.fill_box(0,0,60,60);
obj.erase_box(5,5,15,15);
obj.circle(50,50,25);
obj.line(0,0,40,40);
}
void loop(){
delay(1000);
}
次に、未定義の参照を取得します。obj.offset
、obj.blacklight
、 と同じpixel
です。
なぜこれが起こっているのかわかりません。そして、私は単純なライブラリを書くことさえできないことに本当に落胆し始めています... とにかく、問題のライブラリは次のとおりです。
これはgLCD.cpp
次のとおりです。
#include "gLCD.h"
HardwareSerial Uart = HardwareSerial();
gLCD::gLCD(){
Uart.begin(115200);
}
void gLCD::box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0F);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void gLCD::fill_box(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x12);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0xFF);
}
void gLCD::circle(int x1, int y1, int rad){
Uart.write(0x7C);
Uart.write(0x03);
Uart.write(x1);
Uart.write(y1);
Uart.write(rad);
Uart.write(0x01);
}
void gLCD::erase_block(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x05);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
}
void arg(){
Uart.print("this is bullsh*t!");
}
void offset(int x1, int y1){
Uart.write(0x7C);
Uart.write(0x18);
Uart.write(x1);
Uart.write(0x7C);
Uart.write(0x19);
Uart.write(y1);
}
void backlight(int duty_cycle){
Uart.write(0x7C);
Uart.write(0x02);
Uart.write(duty_cycle);
}
void line(int x1, int y1, int x2, int y2){
Uart.write(0x7C);
Uart.write(0x0C);
Uart.write(x1);
Uart.write(y1);
Uart.write(x2);
Uart.write(y2);
Uart.write(0x01);
}
void pixel(int x ,int y ,int sr){
Uart.write(0x7C);
Uart.write(0x10);
Uart.write(x);
Uart.write(y);
Uart.write(sr);
}
これは gLCD.h です:
#ifndef gLCD_h
#define gLCD_h
#include <Arduino.h>
class gLCD{
public:
gLCD();
void box(int x1, int y1, int x2, int y2);
void fill_box(int x1, int y1, int x2, int y2);
void circle(int x1, int y1, int rad);
void offset(int x1, int y1);
void backlight(int duty_cycle);
void line(int x1, int y1, int x2, int y2);
void pixel(int x ,int y ,int sr);
void erase_block(int x1, int y1, int x2, int y2);
void arg();
};
#endif