Vincent Belanger
/
Receiver
Receiver code
Diff: Xbee.cpp
- Revision:
- 0:f8873e0badb2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xbee.cpp Thu Feb 18 13:22:31 2016 +0000 @@ -0,0 +1,90 @@ +#include "mbed.h" +#include "Xbee.h" + +// Fonction d'assignation du PAN ID +void setPanId(Serial* xbee, long long panId) +{ + // Construction de la trame + const int frameLength = 16; + char frame[frameLength]; + frame[0] = 0x7E; // Start delimiter + frame[1] = 0x00; // Length (MSB) + frame[2] = 0x0C; // Length (LSB) + frame[3] = 0x08; // AT Command + frame[4] = 0x00; // Frame ID + frame[5] = 'I'; + frame[6] = 'D'; + frame[7] = (panId >> 56) & 0xFF; + frame[8] = (panId >> 48) & 0xFF; + frame[9] = (panId >> 40) & 0xFF; + frame[10] = (panId >> 32) & 0xFF; + frame[11] = (panId >> 24) & 0xFF; + frame[12] = (panId >> 16) & 0xFF; + frame[13] = (panId >> 8) & 0xFF; + frame[14] = (panId >> 0) & 0xFF; + frame[15] = checksum(frame, 3, 15); + + // Envoi sur le UART + if (xbee->writeable()) + { + for (int i = 0; i < frameLength; i++) + { + xbee->putc(frame[i]); + } + } +} + +// Envoi d'un message au coordinateur (Transmit Request) +void transmitRequest(Serial* xbee, char* data, int size) +{ + // Construction de la trame + const int frameLength = 18 + size; + char frame[frameLength]; + frame[0] = 0x7E; // Start delimiter + frame[1] = 0x00; // Length (MSB) + frame[2] = 0x0E + size; // Length (LSB) + frame[3] = 0x10; // AT Command + frame[4] = 0x01; // Frame ID + frame[5] = (MAC_ADDRESS_COORDINATOR >> 56) & 0xFF; + frame[6] = (MAC_ADDRESS_COORDINATOR >> 48) & 0xFF; + frame[7] = (MAC_ADDRESS_COORDINATOR >> 40) & 0xFF; + frame[8] = (MAC_ADDRESS_COORDINATOR >> 32) & 0xFF; + frame[9] = (MAC_ADDRESS_COORDINATOR >> 24) & 0xFF; + frame[10] = (MAC_ADDRESS_COORDINATOR >> 16) & 0xFF; + frame[11] = (MAC_ADDRESS_COORDINATOR >> 8) & 0xFF; + frame[12] = (MAC_ADDRESS_COORDINATOR >> 0) & 0xFF; + frame[13] = 0xFF; // Broadcast + frame[14] = 0xFE; // Broadcast + frame[15] = 0x00; // Broadcast radius + frame[16] = 0x00; // Options + + // Ajout des données utiles + for (int i = 0; i < size; i++) + { + frame[17 + i] = data[i]; + } + frame[17 + size] = checksum(frame, 3, 17 + size); + + // Envoi sur le UART + if (xbee->writeable()) + { + for (int i = 0; i < frameLength; i++) + { + xbee->putc(frame[i]); + } + } +} + +// Fonction de calcul de checksum +char checksum(char* frame, int begin, int end) +{ + char sum = 0; + + // Addition des bits + for (int i = begin; i < end; i++) + { + sum += frame[i]; + } + + return 0xFF - sum; +}