Я уже некоторое время размахиваю мозгом. Прежде чем внести некоторые изменения в способ обработки данных пакета с помощью моего объекта SAIAI_DEV, я смог отлично работать (за исключением ошибки в обработке подтверждения, что потребовало изменений). Однако теперь устройство перезапускается после вывода «About to Init» (у меня есть еще одна инструкция печати в качестве первой строки функции init). Кроме того, без 1-секундных задержек происходит зависание в «предыдущей функции 0.» до завершения линии. Я попытался сократить использование динамической памяти (поместить вещи в PROGMEM, сокращенную функцию и количество состояний) примерно до 34%, что указывает на проблему без памяти и имеет ту же проблему. Я тоже не использую прерывания.Почему перезагрузка Arduino перед входом в функцию инициализации?
Код установки:
void setupDevice(){
SoftwareSerial* xbeeSerial = new SoftwareSerial(RX_PIN,TX_PIN);
Serial.begin(BAUD);
xbeeSerial->begin(BAUD);
comm.init(xbeeSerial,&Serial,ENDNODE);
comm.report();
Serial.println(F("Past report."));
sensor.read22(SENSOR_PIN);
Serial.println(F("Past Sense."));
sprintf(states[0].name, "%.14s", "Temperature");
itoa((int)(sensor.temperature_f*10),states[0].value,63);
states[0].number = 0;
states[0].type = FLOAT;
states[0].divisor = 1;
Serial.println(F("Past State 0."));
delay(1000);
sprintf(states[1].name, "%.14s", "Humidity");
itoa((int)(sensor.humidity*10),states[1].value,63);
states[1].number = 1;
states[1].type = FLOAT;
states[1].divisor = 1;
Serial.println(F("Past State 1."));
delay(1000);
sprintf(functions[0].name, "%.79s", "Toggle LED");
functions[0].num_parameters = 0;
functions[0].function_pntr = &toggleLED;
Serial.println(F("Past Function 0."));
delay(1000);
sprintf(functions[1].name, "%.79s", "Change Temperature Unit");
functions[1].num_parameters = 1;
functions[1].function_pntr = &changeUnit;
functions[1].params = &func1_param;
Serial.println(F("Past Function 1."));
delay(1000);
sprintf(functions[1].params[0].name, "%.79s", "Unit of Temperature");
functions[1].params[0].type = CHAR;
sprintf(functions[1].params[0].value, "%.64s", "F");
Serial.println(F("Past F0 Param 0."));
delay(1000);
sprintf(info.name, "%.79s", "Smart Sensor");
info.num_states = 2;
info.num_functions = 2;
info.states = states;
info.functions = functions;
Serial.println(F("Info"));
delay(1000);
Serial.println(F("About to Init."));
delay(1000);
dev.init(&comm,&info);
}
// the setup routine runs once when you press reset:
void setup() {
Serial.println(F("\nEnter Setup."));
temp_unit = 'F';
pinMode(LED_PIN, OUTPUT);
setupDevice();
count = millis();
}
Init Функция:
void SAIAI_DEV::init(XBEE* xb_dev, device_info* info){
comms->serial->println(F("Init Start."));
delay(1000);
bool success = false;
comms = xb_dev;
device = info;
while(!success){
success = true;
memset(comms->rx_pkt->cmdData,0,95);
memset(ack_buffer, 0, PROTOCOL_SIZE);
memset(data, 0, PROTOCOL_SIZE);
wait_for_coordinator();
success &= transmit_init();
if(success) success &= transmit_identity();
if(success) success &= transmit_states();
if(success) success &= transmit_functions();
if(success) { success &= finish_init();}
}
comms->serial->println(F("Init Done!"));
}
Любые мысли будут оценены. Если вам нужно больше источников, я рад предоставить.