Некорректная отработка кода
- Войдите на сайт для отправки комментариев
Вс, 04/04/2021 - 23:38
Здравствуйте, подскажите пожалуйста - вопрос очень прост. У меня есть функция, выполняющаяся в setup - simSetup(), и в ней выполняется функция 1 sendSMS() скорее всего я тупой - или колеса не едут, но почему-то код из sendSMS() выполняется раньше, чем simSetup(). Т.е нарушается последовательность исполнения кода. Я студент + новичок поэтому предполагаю (на основе знаний из других языков программирования), что проблема может быть в потоках, хотя не особо знаю как потоки реализованы в arduino. Пруф о том, что код sendSMS() выполняется раньше

#define CH_NUM 0x60 // номер канала, должен совпадать с передатчиком (датчик)
// УРОВЕНЬ МОЩНОСТИ ПЕРЕДАТЧИКА
// На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
#define SIG_POWER RF24_PA_MAX
// СКОРОСТЬ ОБМЕНА
// На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
// должна быть одинакова на приёмнике и передатчике!
// при самой низкой скорости имеем самую высокую чувствительность и дальность!!
// ВНИМАНИЕ!!! enableAckPayload (основная функция обмена данными) НЕ РАБОТАЕТ НА СКОРОСТИ 250 kbps!
#define SIG_SPEED RF24_1MBPS
//--------------------- НАСТРОЙКИ ----------------------
//--------------------- БИБЛИОТЕКИ ---------------------
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10
#include "SoftwareSerial.h" //библиотека для создания сериал порта на любом пине
SoftwareSerial SIM800(2,3);
//--------------------- БИБЛИОТЕКИ ---------------------
//--------------------- ПЕРЕМЕННЫЕ ----------------------
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte callbackData[3]; // массив принятых данных
byte Data[4]; //массив отправляемых данных
byte pipeNo; //Байтовая переменная хранения номера трубы для отправки
struct Sensor { //Переменная типа struct для хранения данных о датчике
byte id;
byte type;
byte data;
};
Sensor cashDataToSend;
//--------------------- ПЕРЕМЕННЫЕ ----------------------
void setup() {
pinMode(4,OUTPUT);
Serial.begin(9600); //открываем порт для связи с ПК
radioSetup();
simSetup();
// writeMainPhone(520534351);
// writeAddPhone(114540246);
// sendSMS("+79160910471","Hi,this is the ansver from arduino");
// delay(10000);
// for(int i =0; i<54; i++){
//// writeNewSensorSettings(0,1,mySensor);
//// clearSensorById(i);
//// delay(200);
// Serial.print("Info "); Serial.println(eeprom_read_byte(i));
// delay(5);
// }
}
int bustatus;
void loop() {
// sendSMS("+79520534351","Hi,this is the ansver from arduino");
// delay(500);
if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема...
Serial.write(SIM800.read()); // ...и выводим их в Serial
if (Serial.available()) // Ожидаем команды по Serial...
SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
if(radio.available()){
Serial.println("Читаю");
radio.read(&callbackData, sizeof(callbackData));
if(callbackData[0]==0){
Serial.println("Новенький");
radio.stopListening();
Serial.println("Перестал читать");
writeNewSensorSettings(callbackData[1],callbackData[2],cashDataToSend);
Data[0]= callbackData[0];
Data[1]= callbackData[1];
Data[2]= cashDataToSend.id;
Data[3]= cashDataToSend.type;
Serial.print("Новый id"); Serial.println(Data[2]);
Serial.print("Новый type"); Serial.println( Data[3]);
while(radio.write(Data, sizeof(Data)) == false){
Serial.println("Пишу");
delay(50);
}
Serial.println("Отправил");
radio.startListening();
Serial.println("Начинаю слушать");
}
}
if(Serial.available()){
bustatus=Serial.parseInt();
Serial.print(bustatus);
switch(bustatus){
case 2:
Serial.print("Я на лоу");
digitalWrite(4,LOW);
break;
case 1:
Serial.print("Я на хай");
digitalWrite(4,HIGH);
break;
}
}
}
void radioSetup() { // настройка радио модуля
radio.begin(); // активировать модуль
radio.setAutoAck(1); // режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); // (время между попыткой достучаться, число попыток)
radio.setPayloadSize(32); // размер пакета, байт
radio.openReadingPipe(1, address[0]); // хотим слушать трубу 0
radio.openWritingPipe(address[1]);
radio.setChannel(CH_NUM); // выбираем канал
radio.setPALevel(SIG_POWER); // уровень мощности передатчика
radio.setDataRate(SIG_SPEED); // скорость обмена
// должна быть одинакова на приёмнике и передатчике!
// при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); // начать работу
radio.startListening(); // начинаем слушать эфир, мы приёмный модуль
}
void simSetup(){
SIM800.begin(19200); //Скорость порта для связи Arduino с GSM модемом
delay(100);
SIM800.println("AT");
delay(100);
SIM800.print("AT+CMGF=1\r");
delay(8000);
sendSMS("+79520534351","Hi,this is the ansver from arduino");
}
void sendSMS(String phone,String message) // Некорректный пример
{
SIM800.println("AT+CMGS=\"" + phone + "\""); // Задаем номер телефона адресата
delay(100);
SIM800.println(message); // Вводим сообщение
delay(100);
SIM800.println((char)26); // Уведомляем GSM-модуль об окончании ввода
delay(100);
SIM800.println();
// Ожидаем отправки
Serial.println("отослал");
}
bool isItFreeCell(int num) {
Serial.print("isItFreeCell() <-"); Serial.println(num) ;
byte cash = eeprom_read_byte((uint8_t*)num);
Serial.print("Что находится в ячейке num"); Serial.println(cash) ;
delay(15);
Serial.print(cash); Serial.print(" = "); Serial.print(cash); Serial.println(" ?") ;
if (cash == 255) {
Serial.println(" Да") ;
return true;
}
else {
Serial.println(" Нет") ;
return false;
}
}
void clearSensorById(int id) {
for (int i = 10; i < 1000; i= i + 3)
{
if (eeprom_read_byte((uint8_t*)i) == id)
{
delay(10);
eeprom_write_byte((byte*)i, 255);
delay(10);
eeprom_write_byte((byte*)i + 1, 255);
delay(10);
eeprom_write_byte((byte*)i + 2, 255);
delay(10);
break;
}
}
}
void writeNewSensorSettings(byte type, byte data, Sensor& CallbackData) {
Sensor mySensor;
mySensor.type = type;
mySensor.data = data;
for (int i = 10; i < 1000; i = i + 3) {
Serial.print("i= "); Serial.println(i) ;
if (isItFreeCell(i) == true) {
delay(500);
if (i==10){
mySensor.id=1;
}else {
mySensor.id = eeprom_read_byte((uint8_t*)i-3)+1; //Чтение из eeprom
}
Serial.print("Старый id = "); Serial.println(mySensor.id);
Serial.print("Новый id = "); Serial.println(eeprom_read_byte((uint8_t*)i-3)) ;
eeprom_write_block((void*)&mySensor, (int*)i, sizeof(mySensor));
eeprom_read_block((void*)&CallbackData, (int*)i, sizeof(CallbackData));
break;
}
}
}
void readSensorSettingsById(int id,Sensor& callbackData){
for (int i =10;i<1000;i= i+3){
if (eeprom_read_byte((uint8_t*)i) == id) {
eeprom_read_block((void*)&callbackData, (int*)i, sizeof(callbackData));
}
}
}
void writeMainPhone(long phomeNumber){ //long поскольку int(16 бит) -32768 до 32767 и по этим причинам не подходит для номера телефона
int n=0;
for(int i=5;i>0;i--){
// Serial.println(i-n);
// Serial.println(phomeNumber%100);
delay(50);
eeprom_write_byte(n, phomeNumber%100);
delay(50);
n++;
phomeNumber/=100;
// Serial.println(n);
// Serial.println(phomeNumber);
}
}
void writeAddPhone(long phomeNumber){ //long поскольку int(16 бит) -32768 до 32767 и по этим причинам не подходит для номера телефона
int n=0;
for(int i=5;i>0;i--){
// Serial.println(i-n);
// Serial.println(phomeNumber%100);
delay(50);
eeprom_write_byte(n+5, phomeNumber%100);
delay(50);
n++;
phomeNumber/=100;
// Serial.println(n);
// Serial.println(phomeNumber);
}
}
Я Вам уже писал, что на картинке ни хрена не видно. Если нужно вставить лог монитора порта, вставляйте его текстом, лучше тоже как код, чтобы номера строк были.
Выложите нормальный код и нормальный лог
В моем неокрепшем уму возникла догадка о том, что код сначала должен инициализироваться (в моем понимании ардуинка должна его сначала прочитать, а потом выполнить), но тогда я до конца не понимаю - почему delay(8000) начинает отрабатывать сразу. Т.е -> как только я загружаю скетч в ардуино и начинаю смотреть в порт, проходит 8 секунд и код описанный выше - исполняется одновременно.
В моем неокрепшем уму
Мой неокрепший ум ни хрена не понял. Выложите нормально код и лог. И объясните толком в чём у Вас проблема.
Текст из порта
Call Ready
Пожалуйста, перечитайте мой вопрос. На всякий случай продублирую - важную строку информации
У меня есть функция, выполняющаяся в setup - simSetup(), и в ней выполняется функция sendSMS()
Сама проблема заключается в том, что- Есть функция simSetup() и в нее вложена функция sendSMS() и почему-то функция
sendSMS() срабатывает раньше чем "Внутренности" simSetup(), хотя вложенная функция стоит после этих самых "Внутренностей". О срабатывании раньше "внутренностей" сигнализирует отправленное в сериал сообщение "отослал" - раньше, чем настройки, отправляемые по ходу кода в сериал перед нимvoid simSetup(){ SIM800.begin(19200); //Скорость порта для связи Arduino с GSM модемом delay(100); SIM800.println("AT"); delay(100); SIM800.print("AT+CMGF=1\r"); delay(8000); sendSMS("+79520534351","Hi,this is the ansver from arduino"); } void sendSMS(String phone,String message) // Некорректный пример { SIM800.println("AT+CMGS=\"" + phone + "\""); // Задаем номер телефона адресата delay(100); SIM800.println(message); // Вводим сообщение delay(100); SIM800.println((char)26); // Уведомляем GSM-модуль об окончании ввода delay(100); SIM800.println(); // Ожидаем отправки Serial.println("отослал"); }Из этого кода видно, что "отослал" должно приходить самым последним - из логики вложенности , а имеем -
отослал
Call Ready
А кто Вам сказал, что оно раньше выполняется?
Вы в simSetup что-то делаете, но ответы не печатаете и даже не вычитываете из буфера. Все ответы от модуля копятся во входном буфере SIM800. Потом Вы заходите в sendSMS в и в нём, в строке №142 печатаете слово "отослал" (его мы и виидм первым). И уже потом Вы заходите в loop и там в строках №№ 61 и 62 начинаете вычитывать их входного буфера и печатать всё, что за это время Вам наприсылал Sim800. Вот и получается, что оно печатается после слова "отослал".
Большое спасибо, ошибочку понял )