2015-03-27 2 views
0

Я уже некоторое время размахиваю мозгом. Прежде чем внести некоторые изменения в способ обработки данных пакета с помощью моего объекта 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!")); 
} 

Любые мысли будут оценены. Если вам нужно больше источников, я рад предоставить.

ответ

0

Очевидно, все, что мне понадобилось, было для меня взглянуть на него в другом контексте (мой собственный пост). Я понял, что я позвонил члену комм, прежде чем он был назначен. Я оставляю это здесь как ответ, потому что мне показалось странным, что неправильное обращение к println в совершенно другой функции могло вызвать проблемы до того, как функция была вызвана. Что-то примечание в будущем, если ваш код когда-либо висит в странном месте.