为什么Arduino在进入初始化函数之前会重新启动?

时间:2015-03-27 05:21:26

标签: c++ arduino

我一直在捣乱我的大脑一段时间。在对SAIAI_DEV对象处理数据包数据的方式进行一些更改之前,我能够完全正常运行(除了确认处理中需要更改的错误)。但是,现在设备在输出"关于初始化"之后重新启动。 (我有另一个print语句作为init函数的第一行)。此外,在没有1秒延迟的情况下,在过去的功能0处发生挂起。"在线完成之前。我已经尝试减少动态内存使用量(将PROGMEM中的内容,减少的功能和状态计数)降低到大约34%,这指向非内存问题,并且具有相同的问题。我也没有明确地使用中断。

设置代码:

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();
}

初始化功能:

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!"));
}

任何想法都将不胜感激。如果您需要更多来源,我很乐意提供。

1 个答案:

答案 0 :(得分:0)

显然我只需要在另一个环境(我自己的帖子)中查看它。我意识到在分配之前我已经通知了一个通讯成员。我在这里留下这个作为答案,因为我发现奇怪的是,在一个完全不同的函数中不正确地调用println能够在调用函数之前引起问题。如果你的代码挂在一个奇怪的地方,将来要注意的事情。