SoftwareSerial как отправить 0

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Есть код 

#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 ее без проблем съедает. и что с этим можно сделат...

 

Maverik
Offline
Зарегистрирован: 12.09.2012

а в этой библиотеке разве есть метод write ? в стандартной есть оба метода, в SoftwareSerial вроде только print.

попробуй замени write на print ?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

метод есть. если написать, к примеру mySerial.write(10); то все нормально работает. 

использовать print не очень хороший вариант, так как это потянет изменение в друшой библиотеки, где этот write в куче мест попадается. 

Ди и неправильно это...

Maverik
Offline
Зарегистрирован: 12.09.2012

интересно. т.е. не отправляется только 0 ? может какая-то сырая версия библиотеки ? варианты разные пробовал ?

  mySerial.write("0");
  mySerial.write(0x00); 
  mySerial.write(byte(0));

и еще с этой библиотекой хорошим тоном считается сначала проверить готовность порта. if (mySerial.available())

еще можно задержку перед выполнением запроса сделать, хотя вряд ли в этом причина. или скорость порта на 9600 заменить.
 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

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). В общем дело похоже в компиляторе и особенностях его работы.... 

 

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Я уже тут где-то писал пример отправки байтов 0-255 через SoftwareSerial.

lihachov
Offline
Зарегистрирован: 20.07.2013

возникла такая же проблема.. Если не сложно, можно еще раз написать?

поиск по форуму особых успехов не принес..

Datak
Offline
Зарегистрирован: 09.10.2014

В классе SoftwareSerial есть несколько функций с одинаковым именем - write. Компилятор просто не смог понять, какую из них Вы пытаетесь вызвать. Не умеет он отличать константу  0  от нулевого указателя. Они в C и C++ записываются одинаково, в отличие от ненулевых чисел и указателей, которые компилятор ни за что и никогда не спутает.

Было же там, выше написано:
write( byte( 0 ) );
Чем не вариант? Всё вполне правильно и грамотно. Вызывается конструктор byte, создающий объект соответствующего типа. :)

Я обычно пишу так, попроще:
write( ( byte )0 );
компилятору просто явно указали тип "нуля".

Ну или так, тоже можно написать в каких-то случаях:
byte i;
........
i = 0;
write( i );

Datak
Offline
Зарегистрирован: 09.10.2014

А если хочется чтобы было как в HardwareSerial, можно подредактировать SoftwareSerial.h

После строки
virtual size_t write(uint8_t byte);

добавляем списанную из HardwareSerial.h:
inline size_t write(int n) { return write((uint8_t)n); }

Я попробовал, всё компилится. :)

sav liana
Offline
Зарегистрирован: 28.11.2016

Просьба удалить мой пост... перенесу в другую тему...