为什么Arduino在进入初始化功能之前会重新启动

Why does the Arduino restarts before entering initialization function?

本文关键字:重新启动 功能 初始化 Arduino 为什么      更新时间:2023-10-16

我已经伤透脑筋一段时间了。在对SAIAI_DEV对象处理数据包数据的方式进行一些更改之前,我能够运行得非常好(除了需要进行更改的确认处理中的一个错误)。然而,现在设备在输出"About to Init"(我有另一个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();
}

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

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

显然,我只需要在另一个上下文中(我自己的帖子)来看待它。我意识到我在分配之前给一名通信成员打了电话。我把这个问题留在这里作为一个答案,因为我觉得奇怪的是,在一个完全不同的函数中不正确地调用println会在调用该函数之前导致问题。如果你的代码挂在一个奇怪的地方,将来需要注意的事情。