我一直在捣乱我的大脑一段时间。在对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!"));
}
任何想法都将不胜感激。如果您需要更多来源,我很乐意提供。
答案 0 :(得分:0)
显然我只需要在另一个环境(我自己的帖子)中查看它。我意识到在分配之前我已经通知了一个通讯成员。我在这里留下这个作为答案,因为我发现奇怪的是,在一个完全不同的函数中不正确地调用println能够在调用函数之前引起问题。如果你的代码挂在一个奇怪的地方,将来要注意的事情。