Serial.print VS Serial.write проблема решена, непонимание осталось
- Войдите на сайт для отправки комментариев
Добрый день! подскажите пожалуйста. проблему то решил, но понять не могу(гуглил уже).
две ардуины, общаются между собой. вторая при этом болтает с ГСМ модулем, поэтому(мало "полноценных" сериалов у уны) и долго решалась проблема, т.к. не видно было что приходит к ней из первой ардуины.
суть пока простая.
через монитор порта в первую ардуину отправляю "1", она шлет это во вторую и на той должен инвертироваться светодиод. но этого не происходило.
в итоге оказалось что при пересыле "1" с первой ардуины на вторую посредством .print() на вторую приходил код символа "1" т.е. 49
но при этом вторая ардуина при приеме смски пересылала данные на первую посредством того же .print() и числа и строки приходили нормально
в итоге в первой ардуине заменил .print() на .write() и данные стали приходить нормально на вторую.
Но не могу понять почему одна при помощи .print() отправляет(ну или принимает) нормально, а вторая нет.
на всякий случай скетчи
первой:
#include <SoftwareSerial.h> SoftwareSerial monport(7, 8); // RX, TX void setup() { // Open serial communications and wait for port to open: monport.begin(9600); monport.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port Serial.begin(9600); Serial.println("Hello, world?"); } void loop() { // run over and over if (Serial.available()) { monport.write(Serial.read()); } if (monport.available()) { Serial.write(monport.read()); } }
второй:
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial-порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> //SoftwareSerial ard2(3, 4); // длина сообщения #define MESSAGE_LENGTH 160 char message[MESSAGE_LENGTH]; // текст сообщения char phone[16];// номер, с которого пришло сообщение char datetime[24];// дата отправки сообщения int messageIndex = 0; char ch; String val; // создаём объект класса GPRS. По умолчанию скорость общения с ним 9600 бод // с помощью него будем давать команды GPRS шилду GPRS gprs(9,12,7,8); //PowerPin,StatusPin,RX,TX void setup() { pinMode(14, OUTPUT); pinMode(15, OUTPUT); digitalWrite(14,LOW); digitalWrite(15,LOW); gprs.powerUpDown(); Serial.begin(9600); while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } if (Serial.available()) { //обработка Serial данных while (Serial.available()) { //сохраняем строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } Serial.println(val); if (val.indexOf("1") > -1) { digitalWrite(14,!digitalRead(14)); } if (val.indexOf("2") > -1) { digitalWrite(15,!digitalRead(15)); } val=""; //очищаем } }
ПС: а выяснил путем подключения одной ардуины к двум мониторам(через SoftwareSerial и хардовый)
Думаю, что через монитор порта Вы изначально отправляете не число "1", а символ "1" с кодом 49.
Serial.read() возврвщает целое число, т.е. в Вашем случае число 49. А опратором print оно преобразуется в строку из двух символов "49".
попытайиесь в первой явно укуазать тип:
monport.print((char)
Serial
.read());
Я эту проблему так решил
Т.е. путем 1000% перерасхода памяти, не говоря о лишних операциях?
Каждому по потребностям
Спасибо, проблема выскакивала на этапе начального пристреливания. как раз таки изза того что не был определен тип перевылаемых данный. и использовал write.
А когда в итоге я начала предварительно из кусков String строк склеивать в одну и потом её пересылать - всё приходило четко. и как оказалось "String" нельзя отправлять посредствам write
А как ты строку пересылаешь?
нууууу как например в монитор порта) только в данном случае по Serial у меня общаются ардуины, а по monport я подключаю монитор порта
А на второй ардуине строку разбираешь?
buf объявлена как String?
# у меня маячек разделения строк