2013-12-10 4 views
1

Код ниже работает отлично БЕЗ функции spinLeft() (которую я скопировал из goForward и изменен). Когда я попытался добавить эту функцию (которая будет использоваться позже), я получил ошибку выше. Но я не вижу, где я сделал что-то еще не сделанное. Как добавление другой функции генерирует эту ошибку?вызов перегруженной записи (int) неоднозначен

Остальная часть сообщения об ошибке говорит:

Roomba4operants.ino: In function 'void spinLeft()': 
Roomba4operants:57: error: call of overloaded 'write(int)' is ambiguous 
/Users/royclymer/Desktop/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:92: note: candidates are: virtual size_t SoftwareSerial::write(uint8_t) 
/Users/royclymer/Desktop/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:49: note:     size_t Print::write(const char*) 

Код:

#include <SoftwareSerial.h> 

int rxPin = 3; 
int txPin = 6; 
int ledPin = 13; 

SoftwareSerial Roomba(rxPin,txPin); 

void setup() { 
    pinMode(ledPin, OUTPUT); // sets the pins as output 
    Serial.begin(115200); 
    Roomba.begin(115200); 
    digitalWrite(ledPin, HIGH); // say we're alive 
    Serial.println ("Sending start command..."); 
    delay (1000); 
    // set up ROI to receive commands 
    Roomba.write(128); // START 
    delay(150); 
    Serial.println ("Sending Safe Mode command..."); 
    delay (1000); 
    Roomba.write(131); // SAFE 
    delay(150); 
    digitalWrite(ledPin, LOW); // say we've finished setup 
    Serial.println ("Ready to go!"); 
    delay (5000); 
} 

void loop() { 
    digitalWrite(ledPin, HIGH); // say we're starting loop 
    Serial.println ("Go Forward"); 
    goForward(); 
    delay (1000); 
    Serial.println ("Halt!"); 
    halt(); 
    Serial.println ("Go Backwards"); 
    delay (200); 
    goBackward(); 
    delay (1000); 
    Serial.println ("Halt!"); 
    halt(); 
    while(1) { } // Stop program 
} 

void goForward() { 
    Roomba.write(137); // DRIVE 
    Roomba.write((byte)0x00); // 0x00c8 == 200 
    Roomba.write(0xc8); 
    Roomba.write(0x80); 
    Roomba.write((byte)0x00); 
} 

void spinLeft() { 
    Roomba.write(137); // DRIVE 
    Roomba.write((byte)0x00); // 0x00c8 == 200 
    Roomba.write(0xc8); 
    Roomba.write(0x00);   //0x0001==spin left 
    Roomba.write((byte)0x01); 
} 

void goBackward() { 
    Roomba.write(137); // DRIVE 
    Roomba.write(0xff); // 0xff38 == -200 
    Roomba.write(0x38); 
    Roomba.write(0x80); 
    Roomba.write((byte)0x00); 
} 

void halt(){ 
byte j = 0x00; 
Roomba.write(137); 
Roomba.write(j); 
Roomba.write(j); 
Roomba.write(j); 
Roomba.write(j); 
} 
+0

Вы заметили, как все остальные '0x00' нам иметь приведённый к 'byte'? –

ответ

8

0x00 можно интерпретировать и как целое буквального или указатель буквальным. Компилятор не знает, что вы имеете в виду, поскольку у вас есть перегрузки для обоих.

Так изменить эту линию:

Roomba.write((byte)0x00); 

или немного более многословный C++ - стиль ролях:

Roomba.write(static_cast<byte>(0x00)); 
+0

Это работает. Благодарю. – user918069

Смежные вопросы