SoftwareSerial как отправить 0
- Войдите на сайт для отправки комментариев
Ср, 19/11/2014 - 18:19
Есть код
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); void setup(void) { mySerial.begin(115200); mySerial.write(0); } void loop(void) { }
он не работает с ошибкой
sketch_nov19a.ino: In function 'void setup()':
sketch_nov19a:8: error: call of overloaded 'write(int, int)' is ambiguous
C:\Users\roman2712\Desktop\arduino-1.0.6\hardware\arduino\cores\arduino/Print.h:54: note: candidates are: size_t Print::write(const char*, size_t)
C:\Users\roman2712\Desktop\arduino-1.0.6\hardware\arduino\cores\arduino/Print.h:53: note: virtual size_t Print::write(const uint8_t*, size_t)
При этом если написать
void setup(void) { Serial.begin(115200); Serial.write(0); } void loop(void) { }
то все компилируется на УРА.
Вопрос, почему SoftwareSerial не отрабатывает команду write(0), при этом просто Serial ее без проблем съедает. и что с этим можно сделат...
а в этой библиотеке разве есть метод write ? в стандартной есть оба метода, в SoftwareSerial вроде только print.
попробуй замени write на print ?
метод есть. если написать, к примеру my
Serial
.write(10); то все нормально работает.
использовать print не очень хороший вариант, так как это потянет изменение в друшой библиотеки, где этот write в куче мест попадается.
Ди и неправильно это...
интересно. т.е. не отправляется только 0 ? может какая-то сырая версия библиотеки ? варианты разные пробовал ?
mySerial.write("0");
mySerial.write(0x00);
mySerial.write(byte(0));
и еще с этой библиотекой хорошим тоном считается сначала проверить готовность порта. if (mySerial.available())
еще можно задержку перед выполнением запроса сделать, хотя вряд ли в этом причина. или скорость порта на 9600 заменить.
mySerial.write("0"); - это отправка символа "0". т.е. в мониторе увидим 0, и это mySerial.write(48);
mySerial.write(0x00); - не компилируется
mySerial.write(byte(0)); - компилируется (я делал uint8_t(0)). не совсем то, что хотелось бы, но пришлось использовать такую конструкцию
До проверки скорости порта и его доступности ту еще не доходит. Это компилятор ругается...
Библиотека - SoftwareSerial входящий в комплект IDE 1.0.6 и 1.5.7. Похожее поведение есть и при использовании lcd.write(0). В общем дело похоже в компиляторе и особенностях его работы....
Я уже тут где-то писал пример отправки байтов 0-255 через SoftwareSerial.
возникла такая же проблема.. Если не сложно, можно еще раз написать?
поиск по форуму особых успехов не принес..
В классе SoftwareSerial есть несколько функций с одинаковым именем - write. Компилятор просто не смог понять, какую из них Вы пытаетесь вызвать. Не умеет он отличать константу 0 от нулевого указателя. Они в C и C++ записываются одинаково, в отличие от ненулевых чисел и указателей, которые компилятор ни за что и никогда не спутает.
Было же там, выше написано:
write( byte( 0 ) );
Чем не вариант? Всё вполне правильно и грамотно. Вызывается конструктор byte, создающий объект соответствующего типа. :)
Я обычно пишу так, попроще:
write( ( byte )0 );
компилятору просто явно указали тип "нуля".
Ну или так, тоже можно написать в каких-то случаях:
byte i;
........
i = 0;
write( i );
А если хочется чтобы было как в HardwareSerial, можно подредактировать SoftwareSerial.h
После строки
virtual size_t write(uint8_t byte);
добавляем списанную из HardwareSerial.h:
inline size_t write(int n) { return write((uint8_t)n); }
Я попробовал, всё компилится. :)
Просьба удалить мой пост... перенесу в другую тему...