I’m struggling to successfully use the AT+SEND command. For example, my RAK3272s Ver. B Arduino AT Command mode software works with “AT+SEND” command when sending a fixed test message of Serial2.print(“AT+SEND=7:”); Serial2.println(“12345678901234567890123456789012”);
However, it results in AT_PARAM_ERROR when sending Serial2.print(“AT+SEND=7:”); Serial2.println(ctrCycles);
Response with Fixed Test data:
Data cycle count of 0
…
Data Send Number: 0
AT+SEND=7:12345678901234567890123456789012
OK
+EVT:SEND_CONFIRMED_OK
Response with Variable data:
Data cycle count of 0
…
Data Send Number: 0
AT+SEND=7:1
AT_PARAM_ERROR
Here is the full Arduino Code with “AT+SEND” (key AT+SEND section with RED Font):
#include <Arduino.h>
static char recv_buf[512];
volatile uint32_t startMillis = 0; // timer for LoRa upload response
const int timeout_ms = 10000; //timeout for LoRa upload response
const int join_timeout_ms = 20000; //timeout for JOIN
bool join = true;
bool stop = false;
volatile int ctr = 0;
const uint32_t timeLoopCycle = 30 * 60 * 1000; //repeat series of data sends every 30 minutes
volatile uint32_t timeNextDataSend = millis();
const uint32_t timePerDataSend = 2 * 60 * 1000; // time between each data send
const uint32_t numbDataSends = 10; // number of data sends per cycle
int ctrCycles = 0;
// RX TX Establish SWAN SERIAL2 port for the RAK3272 module
HardwareSerial Serial2(PA10, PA9); // This works to connect SWAN TX, RX pins to RAK3272S UART2 (which accepts AT commands)
//--------------------------------------------------------------------------------------------------------------
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
delay(5000);
Serial.begin(115200);
delay(1000);
Serial2.begin(115200);
delay(1000); //Serial port for RAK3272
Serial.println(“Setup started”);
delay(100);
Serial2.println(“AT”);
delay(100);
Serial2.println(“AT+BAND=5”);
delay(100);
Serial2.println(“AT+CLASS=A”);
delay(100);
Serial2.println(“AT+MASK=0002”);
delay(100);
Serial2.println(“AT+CHE=1:2”);
delay(100);
Serial2.println(“AT+CFM=1”);
delay(100);
Serial2.println(“AT+ADR=1”);
delay(100);
int ch;
int index;
startMillis = millis();
do
{
while (Serial2.available() > 0)
{
ch = Serial2.read();
recv_buf[index++] = ch;
Serial.print((char)ch);
delay(20);
}
} while (millis() - startMillis < join_timeout_ms);
delay(5000);
digitalWrite(LED_BUILTIN, LOW); // turn off LED to indicate Setup completed
}
//-------------------------------------------------------------------------------------------------------------
void loop()
{
int ch;
int index;
// Join Network if needed
if(join==true)
{
Serial.println(“send JOIN command”);
Serial2.println(“AT+JOIN=1:1:8:3”); //Set for confirmed data download and 3 retries
delay(5000);
startMillis = millis();
do
{
while (Serial2.available() > 0)
{
ch = Serial2.read();
recv_buf[index++] = ch;
Serial.print((char)ch);
delay(20);
}
} while (millis() - startMillis < join_timeout_ms);
Serial.println(" ");
Serial2.println(“AT+SEND=6:00”);
startMillis = millis();
index = 0;
do
{
while (Serial2.available() > 0)
{
ch = Serial2.read();
recv_buf[index++] = ch;
Serial.print((char)ch);
delay(20);
}
} while (millis() - startMillis < join_timeout_ms);
Serial.println(" ");
join = false;
delay(2000);
}
// Determine if data to be sent to the gateway now
if (timeNextDataSend < millis()) //test if time to send next data series
{
ctr=0;
stop = false;
Serial.print("Data cycle count of ");
Serial.println(ctrCycles);
ctrCycles++;
timeNextDataSend = millis()+timeLoopCycle; // set time for next loop cycle
}
// Send data to Gateway at interval
while (ctr < numbDataSends)
{
digitalWrite(LED_BUILTIN, HIGH); // Turn on LED when data to send to Gateway
Serial.println("…");
Serial.print("Data Send Number: ");
Serial.println(ctr);
delay(500);
Serial2.print("AT+SEND=7:");
Serial2.println("12345678901234567890123456789012");
delay(500);
//Serial2.print("AT+SEND=7:"); Serial2.println(ctrCycles);
delay(100);
startMillis = millis();
index = 0;
do
{
while (Serial2.available() > 0)
{
ch = Serial2.read();
recv_buf[index++] = ch;
Serial.print((char)ch);
delay(20);
}
} while (millis() - startMillis < join_timeout_ms);
digitalWrite(LED_BUILTIN, LOW);
delay(timePerDataSend);
ctr++;
}
if(ctr >= numbDataSends)
{
ctr = 0;
}
}