I'm trying to send text (placed in uint8_t arrays) from one Arduino to another through XBee shields. The library I'm using for this is Andrew Rapp's xbee-arduino.
I can get both Arduino's comunicating with each other, but somehow the receiving Arduino only ever receives up to a maximum of two bytes, no matter the size of what I'm sending (currently, I'm sending {'T', 'e', 's', 't' }).
I posted the relevant code below. Hopefully someone will have a suggestion.
// Code on both arduinos
/**********************************************************************
XBEE
**********************************************************************/
/* XBee ontvangst variabelen.
*/
XBee xbee = XBee();
// Reusable variables for retrieving information.
XBeeResponse response = XBeeResponse();
Rx16Response rx16 = Rx16Response();
Rx64Response rx64 = Rx64Response();
// De data die ontvangen wordt.
uint8_t signalStrength = 0; // de signaalsterkte van het laaste ontvangen signaal
uint8_t option = 0; // geen idee
uint8_t* data = 0; // de ontvangen data
/* Xbee verzend variabelen
*/
char payload[20]; // Integer array die verzonden kan worden.
// Reusable variables for transmitting information
//XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x4008b490); // This is the SH + SL address of remote XBee COM6 (Green tate)
XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x404acbbc); // This is the SH + SL address of remote XBee COM7 (Purple tate)
Tx64Request tx64 = Tx64Request(addr64, (uint8_t*)payload, sizeof(payload)); // unless you have set DH/DL for 64 bit this will be received as a RX16 packet
TxStatusResponse txStatus = TxStatusResponse(); // This will contain the status responses of that the XBee receives
/* Ontvangt een request als deze bestaat.
Als een request gevonden is en deze is geldig, geeft de methode true terug.
Tegelijkertijd worden de volgende variabeles ingevuld.
option - Geen idee waar dit voor is
data - De data die verstuurd is
rssi - De signaalsterkte van de ontvangen request
Als er geen request gevonden is of deze is ongeldig, geeft de methode false terug op de eerste plek van de uint8_t array (data[0]).
*/
boolean retrieveRequest() {
if( xbee.getResponse().isAvailable() ) {
// Pakket ontvangen.
if( xbee.getResponse().getApiId() == RX_64_RESPONSE || xbee.getResponse().getApiId() == RX_16_RESPONSE ) {
// Proper response.
if( xbee.getResponse().getApiId() == RX_64_RESPONSE ) {
xbee.getResponse().getRx64Response(rx64);
option = rx64.getOption();
data = &rx64.getData(0);
signalStrength = rx64.getRssi();
}
else if( xbee.getResponse().getApiId() == RX_16_RESPONSE ) {
xbee.getResponse().getRx16Response(rx16);
option = rx16.getOption();
data = &rx64.getData(0);
signalStrength = rx16.getRssi();
}
return true;
}
}
else {
// Geen geldige request ontvangen.
return false;
}
}
/* Een methode om bericht te sturen.
Geeft true als het bericht goed ontvangen is en false als dit niet gelukt is.
*/
boolean sendRequest( uint8_t* p) {
tx64 = Tx64Request( addr64, p, sizeof( p ) );
xbee.send( tx64 );
if( xbee.readPacket( 2000 ) ) {
// Got a response!
// should be a znet tx status
if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) {
trace( "TXRES", 0, 10 );
xbee.getResponse().getZBTxStatusResponse(txStatus);
// get the delivery status, the fifth byte
if (txStatus.getStatus() == SUCCESS) {
// success. time to celebrate
trace( "Success" );
return true;
}
else {
// the remote XBee did not receive our packet. is it powered on?
trace( "Request fail" );
return false;
}
}
}
else {
// local XBee did not provide a timely TX Status Response -- should not happen
trace( "TX response" );
trace( "failed.", 0, 12 );
return false;
}
}
// Code on sending arduino
void loop() {
uint8_t test[] = {'T', 'e', 's', 't' };
sendRequest( (uint8_t*)test );
}
// Code on receiving arduino
void loop() {
trace("wait", 0, 2 );
if( xbee.readPacket( 2000 ) ) {
trace("packet found", 0, 12);
delay( 100 );
if( xbee.getResponse().isAvailable() ) {
trace( "pack avail", 0, 22 );
retrieveRequest();
trace( "pack read", 0, 32 );
//sprintf( debug, "%c", rx16.getData(0) );
trace( &rx16.getData(0), 0, 42 );
sprintf(debug, "%d", sizeof( &rx16.getData(0) ) );
trace( debug, 0, 52 );
}
}
else {
trace( "no packet", 0, 12 );
}
}
// output on receiving arduino
wait
packet found
pack available
pack read
Te <---- This is the weird part. Somehow I only end up receiving 2 bytes.
2 <---- sizeof( &rx16.getData(0) ). Seems to be working properly.