Cant get serial input DFrobot sensor data in time LMIC Arduino TTN

I just cant seem to get this to work I have scoured the net and read so many posts but I am unsure of what I am doing wrong.
also Lmic_setTxData2 gets upset with arg 2.
The do_read_sensor() function always comes back empty.
i.e. distance is always zero.
Any help would be very graciously appreciated.

#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>

#include <SoftwareSerial.h>

unsigned char buffer_RTT[4] = {0};// Used to store data read from the serial port
int distance;//Used to store the read distance value
unsigned char CS;//Save checksum
#define COM 0x55
SoftwareSerial mySerial(11, 12); // RX, TX

//
// For normal use, we require that you edit the sketch to replace FILLMEIN
// with values assigned by the TTN console. However, for regression tests,
// we want to be able to compile these scripts. The regression tests define
// COMPILE_REGRESSION_TEST, and in that case we define FILLMEIN to a non-
// working but innocuous value.
//
// #ifdef COMPILE_REGRESSION_TEST
// # define FILLMEIN 0
// #else
// # warning “You must replace the values marked FILLMEIN with real values from the TTN control panel!”
// # define FILLMEIN (#dont edit this, edit the lines that use FILLMEIN)
// #endif

// This EUI must be in little-endian format, so least-significant-byte
// first. When copying an EUI from ttnctl output, this means to reverse
// the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3,
// 0x70.
static const u1_t PROGMEM APPEUI[8]= {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}

// This should also be in little endian format, see above.
static const u1_t PROGMEM DEVEUI[8]= {xxxxxxxx};
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}

// This key should be in big endian format (or, since it is not really a
// number but a block of memory, endianness does not really apply). In
// practice, a key taken from the TTN console can be copied as-is.
static const u1_t PROGMEM APPKEY[16] = {xxxxxxx};
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);}

static osjob_t sendjob;
static osjob_t readjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 60;

// Pin mapping for Dragino Lorashield
const lmic_pinmap lmic_pins = {
.nss = 10,
.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 6, 7},
};

void onEvent (ev_t ev) {
Serial.print(os_getTime());
Serial.print(": ");
switch(ev) {
case EV_SCAN_TIMEOUT:
Serial.println(F(“EV_SCAN_TIMEOUT”));
break;
case EV_BEACON_FOUND:
Serial.println(F(“EV_BEACON_FOUND”));
break;
case EV_BEACON_MISSED:
Serial.println(F(“EV_BEACON_MISSED”));
break;
case EV_BEACON_TRACKED:
Serial.println(F(“EV_BEACON_TRACKED”));
break;
case EV_JOINING:
Serial.println(F(“EV_JOINING”));
break;
case EV_JOINED:
Serial.println(F(“EV_JOINED”));
{
u4_t netid = 0;
devaddr_t devaddr = 0;
u1_t nwkKey[16];
u1_t artKey[16];
LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
Serial.print("netid: ");
Serial.println(netid, DEC);
Serial.print("devaddr: ");
Serial.println(devaddr, HEX);
Serial.print(“artKey: “);
for (int i=0; i<sizeof(artKey); ++i) {
Serial.print(artKey[i], HEX);
}
Serial.println(””);
Serial.print(“nwkKey: “);
for (int i=0; i<sizeof(nwkKey); ++i) {
Serial.print(nwkKey[i], HEX);
}
Serial.println(””);
}
Serial.println(F(“Successful OTAA Join…”));
// Disable link check validation (automatically enabled
// during join, but because slow data rates change max TX
// size, we don’t use it in this example.
LMIC_setLinkCheckMode(0);
break;
/*
|| This event is defined but not used in the code. No
|| point in wasting codespace on it.
||
|| case EV_RFU1:
|| Serial.println(F(“EV_RFU1”));
|| break;
/
case EV_JOIN_FAILED:
Serial.println(F(“EV_JOIN_FAILED”));
break;
case EV_REJOIN_FAILED:
Serial.println(F(“EV_REJOIN_FAILED”));
break;
break;
case EV_TXCOMPLETE:
Serial.println(F(“EV_TXCOMPLETE (includes waiting for RX windows)”));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F(“Received ack”));
if (LMIC.dataLen) {
Serial.print(F(“Received “));
Serial.print(LMIC.dataLen);
Serial.println(F(” bytes of payload”));
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
// Schedule next Sensor read
os_setCallback(&readjob, do_read_sensor);
break;
case EV_LOST_TSYNC:
Serial.println(F(“EV_LOST_TSYNC”));
break;
case EV_RESET:
Serial.println(F(“EV_RESET”));
break;
case EV_RXCOMPLETE:
// data received in ping slot
Serial.println(F(“EV_RXCOMPLETE”));
// Schedule next Sensor read
//os_setCallback(&readjob, do_read_sensor);
break;
case EV_LINK_DEAD:
Serial.println(F(“EV_LINK_DEAD”));
break;
case EV_LINK_ALIVE:
Serial.println(F(“EV_LINK_ALIVE”));
break;
/

|| This event is defined but not used in the code. No
|| point in wasting codespace on it.
||
|| case EV_SCAN_FOUND:
|| Serial.println(F(“EV_SCAN_FOUND”));
|| break;
*/
case EV_TXSTART:
Serial.println(F(“EV_TXSTART”));
break;
default:
Serial.print(F("Unknown event: "));
Serial.println((unsigned) ev);
break;
}
}

void do_send(osjob_t* j){
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
Serial.println(F(“OP_TXRXPEND, not sending”));
} else
{

    // prepare upstream data transmission at the next possible time.
    // transmit on port 1 (the first parameter); you can use any value from 1 to 223 (others are reserved).
    // don't request an ack (the last parameter, if not zero, requests an ack from the network).
    // Remember, acks consume a lot of network resources; don't ask for an ack unless you really need it.
    
    LMIC_setTxData2(1,distance, sizeof(distance), 0);
    Serial.println(F("Packet queued"));
    Serial.print(F("Sending packet on frequency: "));
    Serial.println(LMIC.freq); 

}
// Next TX is scheduled after TX_COMPLETE event.

}
void do_read_sensor(osjob_t* j){
// Get distance data from Ultrasonic sensor Serial Mode
mySerial.write(COM);
delay(100);
if (mySerial.available() > 0){
delay(4);
if(mySerial.read() == 0xff){ //Check packet header
buffer_RTT[0] = 0xff;
for (int i=1; i<4; i++){
buffer_RTT[i] = mySerial.read(); //Read distance data
}
CS = buffer_RTT[0] + buffer_RTT[1]+ buffer_RTT[2]; //Compute checksum
if(buffer_RTT[3] == CS) {
distance = (buffer_RTT[1] << 8) + buffer_RTT[2];//Calculate distance

          }
        }       
      } 
      Serial.println("Distance: ");
      Serial.print(distance);
      Serial.println("mm");

}

void setup() {
Serial.begin(115200);
mySerial.begin(9600);

Serial.println(F("Starting"));

#if defined(CFG_au921)
Serial.println(F("Loading AU915/AU921 Configuration..."));
#endif

// LMIC init
os_init();
// Reset the MAC state. Session and pending data transfers will be discarded.
LMIC_reset();

LMIC_setDrTxpow(DR_SF7, 14);
LMIC_selectSubBand(1);
LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100);

// Start job (sending automatically starts OTAA too)
do_read_sensor(&readjob);
do_send(&sendjob);

}

void loop() {
os_runloop_once();
}

I’ve removed the block at the top in bold - may just be a copy & paste problem but it would be nice to us all if you could use the toolbar to format the code please.

That said, this seems to be entirely about getting your distance sensor working.

And perhaps using a more up to date LMIC as there seems to be stuff in there that’s going to give misleading info - like the Tx frequency.

As for the TxData2, you need to give the function the parameters it’s expecting - which is a pointer to a buffer, not an integer value.

I apologise for the formatting I am not used to forums , as I usually don’t ask for help.
I am just trying to get a reliable remote water tank sensor going for my farm.
My programming experience Is like my forum experience .
Are there any decent examples available to demonstrate reading serial (rs232) sensors and sending the data up to the TTN.
Thanks.

It’s just using a toolbar - like the buttons on the Arduino IDE …

There may be stuff on serial sensors, there are many many posts on the forum you can use the search for. But the two matters aren’t related.

You get the sensor data in to a variable. I’d do that in a standalone sketch and DFrobot are pretty good with examples & code, so maybe there’s something already done.

Then you take the variable, put it in to the buffer and send it. This may help: https://www.thethingsnetwork.org/docs/devices/bytes/ - ignore the pink message, this info still applies.

There are off the shelf sensors for that - may save you time and be reliable …

Thanks
the off the shelf stuff available here in australia is cr$% and I have spent heaps of $ and got nowhere .
I have removed the payload issue by re formatting the data and the code that I have used for the sensor is from Drobots wiki, which works perfectly outside of the LMIC environment.
The Serial.print’s do not show up in the terminal yet all of the other ones throughout the code do.
See Below.

void do_read_sensor(osjob_t* j){
   mySerial.write(COM);
  delay(100);
  if(mySerial.available() > 0){
    delay(4);
    if(mySerial.read() == 0xff){    //Judge packet header
      buffer_RTT[0] = 0xff;
      for (int i=1; i<4; i++){
        buffer_RTT[i] = mySerial.read();    //Read data
      }
      CS = buffer_RTT[0] + buffer_RTT[1]+ buffer_RTT[2];  //Compute checksum
      if(buffer_RTT[3] == CS) {
        distance = (buffer_RTT[1] << 8) + buffer_RTT[2];//Calculate distance
         // int -> bytes
        byte dist_low = lowByte(distance);
        byte dist_high = highByte(distance);
        // place the bytes into the payload
        payload[0] = dist_low;
        payload[1] = dist_high;

        Serial.print("Distance:");
        Serial.print(distance);
        Serial.println("mm");
      }
    }
  }
}

the output in the serial terminal is:

424315: EV_TXCOMPLETE (includes waiting for RX windows)
Starting
Loading AU915/AU921 Configuration...
Packet queued
Sending packet on frequency: 0
6614: EV_JOINING
6919: EV_TXSTART
492695: EV_JOINED
netid: 19
devaddr: 260D887B
artKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
nwkKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Successful OTAA Join...
493572: EV_TXSTART
1033404: EV_TXCOMPLETE (includes waiting for RX windows)
4783797: EV_TXSTART
1033404: EV_TXCOMPLETE (includes waiting for RX windows)
4783797: EV_TXSTART
Packet queued
Sending packet on frequency: 917600000
5329416: EV_TXCOMPLETE (includes waiting for RX windows)
9079809: EV_TXSTART
Packet queued
Sending packet on frequency: 918000000
9603997: EV_TXCOMPLETE (includes waiting for RX windows)
13354390: EV_TXSTART
Packet queued
Sending packet on frequency: 916800000
13954605: EV_TXCOMPLETE (includes waiting for RX windows)

The LMIC jobs system is more Computer Science than being totally clear.

Remove the parameter to your do_read_sensor and then just call the function before the LMIC_setTxData2