Моя проводка такая:
XBee настроен в режиме API 1, и mbed (LPC1768) выполняет этот код:
Serial terminal(USBTX, USBRX);
wait_ms(1000);
while(!terminal.readable()) {
wait_ms(10);
}
terminal.getc();
mbed_led1 = 1;
while(1) {
xbee.readPacketUntilAvailable();
terminal.puts("Packet available\r\n");
XBeeResponse response = xbee.getResponse();
if (response.isAvailable()) {
char tmp[20];
int c = response.getApiId();
sprintf(tmp, "%d", c);
terminal.puts("Response available at API: ");
terminal.puts(tmp);
terminal.puts("\r\n");
if (response.getApiId() == RX_16_RESPONSE) {
Rx16Response rx16 = Rx16Response();
response.getRx16Response(rx16);
uint8_t len = rx16.getDataLength();
char l[20];
sprintf(l, "%d", len);
terminal.puts("We have data: ");
terminal.puts(l);
terminal.puts("\r\n");
}
}
wait(1);
}
Библиотека XBee для mbed, по сути, является портом широко популярной библиотеки Arduino XBee. Источники здесь: http://mbed.org/users/okini3939/code/XBee/
И когда вышеупомянутый код выполняется, мой вывод такой:
Terminal ready
Packet available
Response available at API: 138
Packet available
Response available at API: 138
...
138 является десятичным представлением шестнадцатеричного 0x8A, который, в свою очередь, отображается в MODEM_STATUS_RESPONSE.
Этот модуль XBee является единственным, который питается.
И мой вопрос: почему у меня такое странное поведение? Почему этот XBee успешно прочитал пакет вообще?
Модуль XBee отправляет кадр состояния модема хосту, и это не результат того, что модуль получил пакет. Попробуйте сбросить оставшуюся часть фрейма состояния модема, чтобы узнать, о каком состоянии модуль XBee пытается сообщить. Это может быть сообщение об аппаратном сбросе (0x00), за которым следует координатор запущен (0x06).
Документация по XBee Series 1 включает в себя список всех возможных значений состояния модема.
Кстати, обновление sprintf(tmp, "%d", c);
использовать "0x%02X"
так как строка формата будет печатать тип фрейма в шестнадцатеричном виде и облегчит поиск типов фреймов в документации.
Других решений пока нет …