duplicate printing
i have created following code , not doing expected do
header file:
cpp file:
sketch file:
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!
can point out mistake?
thanks in advance

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!

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
Post a Comment