Я сделал установку, состоящую из 3 маршрутизаторов Zigbee, 2 маршрутизаторов (Zigbee S2C) и 1 координатора (Zigbee S2). Каждый маршрутизатор подключается к arduino nano, который собирает данные из 2 FSR и IMU (тип кадра: запрос передачи zigbee и размер пакета 46 байтов) и отправляет его координатору, прикрепленному к arduino UNO. Все Xbees находятся в режиме API 2 и работают со скоростью в 115200. Я использую библиотеку под названием «Simple Zigbee Library», чтобы отправить все собранные данные Координатору. Сбор и отправка данных прекрасно работает, за исключением того, что пакеты потеряны. Данные образца нано на частоте около 25 Гц независимо. Координатор пытается прочитать данные, отправляемые от зигбеков (используя библиотеку, конечно) в каждом цикле, но, к сожалению, он, кажется, получает только около 40-45 выборок. (Должно быть 25 * 2 = 50 выборок всего из 2 xbees). Кто-нибудь может предположить, почему это происходит. Мне нужно как можно меньше потери данных для моей установки, чтобы достичь ее мотива. Любая помощь приветствуется.Почему пакеты данных отсутствуют в настройке Zigbee arduino?
P.S: Возможно, важно отметить, что координатор считывает данные только с одного xbee в каждом цикле.
Спасибо.
void setup()
{
// Start the serial ports ...
Serial.begin(115200);
while(!Serial){;} // Wait for serial port (for Leonardo only).
xbeeSerial.begin(115200);
// ... and set the serial port for the XBee radio.
xbee.setSerial(xbeeSerial);
// Set a non-zero frame id to receive Status packets.
xbee.setAcknowledgement(true);
}
void loop()
{
// While data is waiting in the XBee serial port ...
while(xbee.available())
{
// ... read the data.
xbee.read();
// If a complete message is available, display the contents
if(xbee.isComplete()){
Serial.print("\nIncoming Message: ");
printPacket(xbee.getIncomingPacketObject());
}
}
delay(10); // Small delay for stability
// That's it! The coordinator is ready to go.
}
// Function for printing the complete contents of a packet //
void printPacket(SimpleZigBeePacket & p)
{
//Serial.print(START, HEX);
//Serial.print(' ');
//Serial.print(p.getLengthMSB(), HEX);
//Serial.print(' ');
//Serial.print(p.getLengthLSB(), HEX);
//Serial.print(' ');
// Frame Type and Frame ID are stored in Frame Data
uint8_t checksum = 0;
for(int i=10; i<p.getFrameLength(); i++){
Serial.print(p.getFrameData(i), HEX);
Serial.print(' ');
checksum += p.getFrameData(i);
}
// Calculate checksum based on summation of frame bytes
checksum = 0xff - checksum;
Serial.print(checksum, HEX);
Serial.println();
}
Вы считаете * столкновение * и * повреждение данных *? Является ли протокол связи достаточным для обработки этих ситуаций? –
Эта ссылка говорит, что: Радио, используемое этими модулями (уровень MAC и PHY), определяется стандартом IEEE 802.15.4, который определяет использование множественного доступа с поддержкой Carrier с предотвращением столкновений или сокращенно CSMA/CA.http://electronics.stackexchange.com/questions/36932/xbee-how-does-it-deal-with-collisions – Aniket
Отлично, но я имел в виду нечто более высокое, чем это.* CSMA/CA * может и окончательно не сможет предотвратить * столкновения * при правильных обстоятельствах, хотя это, безусловно, лучше иметь его, чем нет. Протокол * более высокого уровня * должен требовать, чтобы каждый пакет был * подтвержден * и принудительно отправлял пакет, если в течение * таймаута * не принимается * ACK *. В прошлый раз я работал с * ZigBee *, хотя я признаю, что не использовал * Arduino *, я должен был реализовать это сам. –