[XBee] Added multiple attempts when connecting

This commit is contained in:
jgromes 2019-01-05 10:20:14 +01:00
parent 5b16b2b10f
commit 2fbb6afcf4
4 changed files with 35 additions and 14 deletions

View file

@ -174,6 +174,7 @@ ERR_CMD_MODE_FAILED LITERAL1
ERR_FRAME_MALFORMED LITERAL1 ERR_FRAME_MALFORMED LITERAL1
ERR_FRAME_INCORRECT_CHECKSUM LITERAL1 ERR_FRAME_INCORRECT_CHECKSUM LITERAL1
ERR_FRAME_UNEXPECTED_ID LITERAL1 ERR_FRAME_UNEXPECTED_ID LITERAL1
ERR_FRAME_NO_RESPONSE LITERAL1
ASCII LITERAL1 ASCII LITERAL1
ASCII_EXTENDED LITERAL1 ASCII_EXTENDED LITERAL1

View file

@ -111,6 +111,7 @@
#define ERR_FRAME_MALFORMED -302 #define ERR_FRAME_MALFORMED -302
#define ERR_FRAME_INCORRECT_CHECKSUM -303 #define ERR_FRAME_INCORRECT_CHECKSUM -303
#define ERR_FRAME_UNEXPECTED_ID -304 #define ERR_FRAME_UNEXPECTED_ID -304
#define ERR_FRAME_NO_RESPONSE -305
// RTTY status codes // RTTY status codes
#define ERR_INVALID_RTTY_SHIFT -401 #define ERR_INVALID_RTTY_SHIFT -401

View file

@ -27,17 +27,35 @@ int16_t XBee::begin(long speed) {
// empty UART buffer (garbage data) // empty UART buffer (garbage data)
_mod->ATemptyBuffer(); _mod->ATemptyBuffer();
// try to find the XBee
bool flagFound = false;
uint8_t i = 0;
while((i < 10) && !flagFound) {
// send test frame (get baudrate setting) // send test frame (get baudrate setting)
uint8_t frameID = _frameID++; uint8_t frameID = _frameID++;
sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "BD"); sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "BD");
int16_t state = readApiFrame(frameID, 4, 2000);
// get response code if(state == ERR_NONE) {
int16_t state = readApiFrame(frameID, 4); flagFound = true;
if(state != ERR_NONE) { } else {
return(state); DEBUG_PRINT_STR("XBee not found! (");
DEBUG_PRINT(i + 1);
DEBUG_PRINT_STR(" of 10 tries) STATE == ");
DEBUG_PRINTLN(state);
DEBUG_PRINTLN_STR("Resetting ...");
reset();
}
} }
return(state); if(!flagFound) {
DEBUG_PRINTLN_STR("No XBee found!");
return(ERR_CMD_MODE_FAILED);
} else {
DEBUG_PRINTLN_STR("Found XBee!");
}
return(ERR_NONE);
} }
void XBee::reset() { void XBee::reset() {
@ -352,13 +370,13 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length
delete[] frame; delete[] frame;
} }
int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos) { int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) {
// TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen. // TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen.
// get number of bytes in response (must be enough to read the length field // get number of bytes in response (must be enough to read the length field
uint16_t numBytes = getNumBytes(5000, 3); uint16_t numBytes = getNumBytes(timeout/2, 3);
if(numBytes == 0) { if(numBytes == 0) {
return(ERR_FRAME_MALFORMED); return(ERR_FRAME_NO_RESPONSE);
} }
// checksum byte is not included in length field // checksum byte is not included in length field
@ -367,7 +385,8 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos) {
// wait until all response bytes are available (5s timeout) // wait until all response bytes are available (5s timeout)
uint32_t start = millis(); uint32_t start = millis();
while(_mod->ModuleSerial->available() < (int16_t)numBytes) { while(_mod->ModuleSerial->available() < (int16_t)numBytes) {
if(millis() - start >= 5000) { if(millis() - start >= timeout/2) {
Serial.println(_mod->ModuleSerial->available());
return(ERR_FRAME_MALFORMED); return(ERR_FRAME_MALFORMED);
} }
} }

View file

@ -79,7 +79,7 @@ class XBee {
void sendApiFrame(uint8_t type, uint8_t id, const char* data); void sendApiFrame(uint8_t type, uint8_t id, const char* data);
void sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length); void sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length);
int16_t readApiFrame(uint8_t frameID, uint8_t codePos); int16_t readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout = 5000);
uint16_t getNumBytes(uint32_t timeout = 10000, size_t minBytes = 10); uint16_t getNumBytes(uint32_t timeout = 10000, size_t minBytes = 10);
}; };