У меня проблема при соединении двух ардуин (uno r3 и wavgat nano 3.0 (ну простите, другого нету)). Передача осуществлена по юарт с помощью software. Они общаются, если сделать очень простую передачу данных: Спойлер: Код Код (C++): #include <SoftwareSerial.h> SoftwareSerial in(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); in.begin(9600); // Скорость обмена данными с модемом in.println("AT"); } void loop() { if (in.available()) // Ожидаем прихода данных (ответа) от модема... Serial.write(in.read()); // ...и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial... in.write(Serial.read()); // ...и отправляем полученную команду модему } При вводе на одном, на втором выводится то что ввел. Это все понятно. Но как мне брать вычисления? Основной контроллер - уна. Ваугат как косвенный. Уна отправляет запрос на косвенный контроллер. Тот в соответствии с запросом или игнорирует или отвечает. Я пытался сделать таким образом: Спойлер: Кол на косвенном мк Код (C++): #include <SoftwareSerial.h> SoftwareSerial input(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) int num = 12; void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); input.begin(9600); // Скорость обмена данными с модемом input.println("AT"); } void loop() { if (input.available()) { // Ожидаем прихода данных (ответа) от модема... Serial.write(input.read()); // ...и выводим их в Serial int readInput = input.read(); if (readInput == 'x'){ input.write('1'); } } if (Serial.available()) // Ожидаем команды по Serial... input.write(Serial.read()); // ...и отправляем полученную команду модему } На уне остался тот же код. При вводе 'x' ничего не происходит. если вывести в сериал значение readInput, то выводится квадратик. Помогите. Что я делаю не так? (или может контроллер настолько отсталый)
1Нахрена 2Сериала? 2Где установка бодрейта Софтсериала? 3Что такое in.println? 4Что такое input.println?
1. Два сериала потому, что через один юарт не работает нифига. Мне нужно и данные на комп выводить, и данными между мк передавать. А он за место достоверных данных мне одни квадратики выдает. Потому я и подключил библиотеку SoftwareSerial.h 2. input.begin(9600); 3, 4 in.println("AT"); это вывод первой команды ( ат команды с sim800l взята, потому я и первый код тоже от туда взял) [вывод с переносом строки]
А Это тогда что? Я же не придумал это все. В софтверсериал есть и begin, и print, и println. Кучу команд у этой библиотеки. Вот функции у данной библиотеки Я дал название подключению библиотеки software serial (SoftwareSerial input(8, 9)). По этому за место software serial я пишу input. команды остались те же самые.
(поянение. Снизу wavgat, сверху уна) Спойлер: Код на вавгате Код (C++): #include <SoftwareSerial.h> SoftwareSerial input(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) int num = 12; void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); input.begin(9600); // Скорость обмена данными с модемом input.println("AT"); } void loop() { if (input.available()) { // Ожидаем прихода данных (ответа) от модема... Serial.write(input.read()); // ...и выводим их в Serial int readInput = input.read(); Serial.write(readInput); if (readInput == 'x'){ input.write('1'); } } if (Serial.available()) // Ожидаем команды по Serial... input.write(Serial.read()); // ...и отправляем полученную команду модему }
И?Вы считаете если Sofwareserial назвать к примеру Шляпой то Шляпа будет работать как Sofwareserial?Что/Кто мешает в коде писать Sofwareserial?Разницу между mySerial.begin(9600);и in.begin(9600); не чувствуете?В первом случае всё же какой никакой Serial устанавливает бод 9600 а во втором вообще пустой оператор ничего не делает и скорость устанавливается от Балды (даже не знаю сколько там по умолчанию)и поэтому принимаются кракозяблы.Да и потом то что пришло не надо разве собирать в строку например? А так? Код (C++): #include <SoftwareSerial.h> SoftwareSerial mySerial(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); mySerial.begin(9600); // Скорость обмена данными с модемом mySerial.println("AT"); } void loop() { if (mySerial.available()) // Ожидаем прихода данных (ответа) от модема... Serial.write(mySerial.read()); // ...и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial... mySerial.write(Serial.read()); // ...и отправляем полученную команду модему }
Грубо говоря это то же самое, что и мой код. Только вы назвали подключение myserial, а я input (in). Ну прошью я. Покажу, что ничего не изменится Это то у меня работает. Мне нужно как то данные с вава передавать на уну, чтобы уна принимала их. ТО есть. Допустим мне нужно из переменной передать число по софтсериалу (допустим 20) Уна это число должна принять и обработать (то есть занести в свою переменную) Как мне это сделать? На счет этого. Кракозябры в последнем случае, что я скинул это int, который я принял с ввода и вывожу в сериал, чтобы посмотреть, что вышло. Там должен быть индекс символа я так понимаю, но почему то ничего нету. (Кстати, я понял почему так происходит. Потому что нужно сперва введые данные принимать в переменную, а уже потом обрабатывать, а не наоборот, как было изначально. Я сперва выводил то, что принял, потом в переменную заносил, а потом обрабатывал. ТАК НЕЛЬЗЯ (если кого то такие же проблемы будут). Вот порядок: 1. приняли и занесли в переменную 2. выведи на экран если надо 3. обработали)
Часть 2. Почему так происходит? Контроллер снизу отправляет данные 225,74. Почему уна его дробит на 2 числа? (есть предположение, что передается только от -128 до 128) Спойлер: Уна Код (C++): #include <SoftwareSerial.h> SoftwareSerial input(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) String comStr = ""; bool priem = false; long tm; float str; void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); input.begin(9600); // Скорость обмена данными с модемом input.println("AT"); } void loop() { if (input.available()){ // Ожидаем прихода данных (ответа) от модема... char com = input.read(); comStr = comStr + com; int leng = comStr.length(); //Serial.print(leng); //Serial.write(' '); //Serial.write(com); // ...и выводим их в Serial //Serial.write(" "); priem = true; } else{ if (comStr != ""){ if ( comStr.toFloat() != 0) str = comStr.toFloat(); if (str != 0){ Serial.println(str); str = 0; } comStr = ""; } } if (Serial.available()) // Ожидаем команды по Serial... input.write(Serial.read()); // ...и отправляем полученную команду модему if (millis() - tm > 5000){ input.write('t'); tm = millis(); } } const char* IntToChar (unsigned int v) { char buffer [20]; sprintf(buffer, "%d", v); return buffer; } const char* intToStr(int x){ char b[5]; String str; str=String(x); str.toCharArray(b,2); return b; } Спойлер: Вав Код (C++): #include <SoftwareSerial.h> #include <HX711_ADC.h> SoftwareSerial input(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) HX711_ADC LoadCell(4, 5); int num = 12; long t; float testFloat = 12.85, wt = 0; char msgBuffer[20]; // убедитесь что стройки размера хватит char *pointer_to_created_string; void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); input.begin(9600); // Скорость обмена данными с модемом input.println("AT"); LoadCell.begin(); long stabilisingtime = 2000; LoadCell.start(stabilisingtime); LoadCell.setCalFactor(696.0); // user set calibration factor (float) Serial.println("Startup + tare is complete"); } void loop() { LoadCell.update(); if (millis() > 250) { tenzo(); } ; if (input.available()) { // Ожидаем прихода данных (ответа) от модема... //Serial.write(input.read()); // ...и выводим их в Serial char readInput = input.read(); //Serial.write(readInput); pointer_to_created_string = dtostrf(wt, 6, 2, msgBuffer); if (readInput == 'x'){ input.println(testFloat); } if (readInput == 't'){ Serial.println(wt); input.write(pointer_to_created_string); } } if (Serial.available()) // Ожидаем команды по Serial... input.write(Serial.read()); // ...и отправляем полученную команду модему } void tenzo(){ wt = LoadCell.getData(); } подключил тензодатчик и передаю вес в граммах.
МК ничего не знает про граммы. Поэтому передавать надо в величанах, понятных МК. А уже на приемной стороне приводить к виду, который удобен для восприятия.