duplicate printing


i have created following code , not doing expected do  >:(

header file:
code: [select]
#ifndef test_h
#define test_h

#include <arduino.h>
#include <softwareserial.h>
#include <xbee.h>

int *processdata(xbee *myxbee, zbrxresponse *myrx, softwareserial *mynss);

#endif


cpp file:
code: [select]
#include "test.h"

int *processdata(xbee *myxbee, zbrxresponse *myrx, softwareserial *mynss){
  int *datavar = (int*)malloc(sizeof(int)*6);
  if (datavar == 0)
  {
  mynss->println("error: out of memory");
  }
  int casenum = -1;
  int incomingbyte;
  char xbv[5];
  int jj = 0;
  int cnt = 0;
 
  myxbee->readpacket();

    if (myxbee->getresponse().isavailable()) {
      // got something
           
      if (myxbee->getresponse().getapiid() == zb_rx_response) {
        // got zb rx packet
       
        // fill our zb rx class
        myxbee->getresponse().getzbrxresponse(*myrx);
           
        if (myrx->getoption() == zb_packet_acknowledged) {
            // sender got ack
            mynss->println("packet acknowledged:");
        } else {
          mynss->println("packet not acknowledged");
        }

        for(cnt = 0; cnt < myrx->getdatalength(); cnt++) {
incomingbyte = myrx->getdata()[cnt];
if(incomingbyte == ','){      // go next array slot
        xbv[jj] = '\0';
casenum++; // increment next letter
datavar[casenum] = atoi(xbv);
jj = -1;
} else {
xbv[jj] = incomingbyte;
}
jj++;
}
      }
    } else if (myxbee->getresponse().iserror()) {
      mynss->print("oh no!!! error code:");
      mynss->println(myxbee->getresponse().geterrorcode());
    }
  return datavar;
}


sketch file:
code: [select]
#include "test.h"
#include <softwareserial.h>
#include <xbee.h>

xbee xbee = xbee();
zbrxresponse rx = zbrxresponse();


// define newsoftserial tx/rx pins
// connect arduino pin 8 tx of usb-serial device
uint8_t ssrx = 8;
// connect arduino pin 9 rx of usb-serial device
uint8_t sstx = 9;
softwareserial nss(ssrx, sstx);


void setup() {
  serial.begin(57600);
  xbee.setserial(serial);
  nss.begin(57600);
  nss.println("starting up!");
}

void loop() {
  if(serial.available()) {
  xbeereport = processdata(&xbee, &rx, &nss);
  (int ii=0; ii<6; ii++) {
  nss.print(xbeereport[ii]);
  nss.print(", ");
  }
  free(xbeereport);
  xbeereport = null;
  nss.println();
  }
}



i sending following message 3 time xbee in api2 mode:
1,-12,2,
31 2c 2d 31 32 2c 32 2c in hex

after receiving message 3 times, looks on terminal:

starting up!
0, 0, 0, 0, 0, 0,
packet acknowledged:
1, -12, 2, 0, 0, 0,
0, -12, 2, 0, 0, 0,
packet acknowledged:
1, -12, 2, 0, 0, 0,
0, -12, 2, 0, 0, 0,
packet acknowledged:
1, -12, 2, 0, 0, 0,


but expected see following message:

starting up!
packet acknowledged:
1, -12, 2, 0, 0, 0,
packet acknowledged:
1, -12, 2, 0, 0, 0,
packet acknowledged:
1, -12, 2, 0, 0, 0,


i can't figure out doing wrong! :smiley-confuse:

can point out mistake?

thanks in advance

code: [select]
xbee xbee = xbee();
zbrxresponse rx = zbrxresponse();

explicitly calling constructor wrong.

the correct way:
code: [select]
xbee xbee;
zbrxresponse rx;


code: [select]
  xbeereport = processdata(&xbee, &rx, &nss);
  (int ii=0; ii<6; ii++) {
  nss.print(xbeereport[ii]);
  nss.print(", ");
  }
  free(xbeereport);
  xbeereport = null;

assuming allocation succeeded bad idea.

you not passing processdata() indicates whether there data xbee read, or not. not passing indicates whether data formed complete, valid packet.

it far better use global array hold data, , avoid malloc() , free() calls (and misuse have now), , have processdata() return boolean indicating whether or not successful.


Arduino Forum > Using Arduino > Programming Questions > duplicate printing


arduino

Comments

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor