Hi,
thanks again for the input. 
I've written some separate Sketch for the json data transmission part (Arduino -> Modem).
It only works though, when I use jsonOut.connect(Serial). When I use jsonOut.connect(ModemPort) the Code can't be compiled.
The Code:
// comment this line out to use real sensor data
#define TEST_DATA
#include "SafeString.h" // download from Arduino Library manager
#include "SafeStringStream.h" // included in V2.0.7 of SafeString
#include "BufferedOutput.h" // included in V2.0.7 of SafeString
#include "loopTimer.h" // install loopTimer from zip file
#include "SoftwareSerial.h" // https://www.arduino.cc/en/Reference/SoftwareSerial communication between Arduino and Module
/// from https://www.forward.com.au/pfod/ArduinoProgramming/RealTimeArduino/index.html
createBufferedOutput(jsonOut, 400, BLOCK_IF_FULL);
// Softwareserial objects
SoftwareSerial ModemPort(11, 12); // RX Pin, TX Pin
const int Number = 1;
// Simulated measurement intervall
unsigned long startMillis;
const unsigned long measurementPeriod = 2000;
#ifdef TEST_DATA // replace measurements with test data
float Bat1 = 3.64; float Bat2 = 3.67;
// 3 minute means of measurements
float t1 = 20.53; float h1 = 66.16;
float t2 = 20.92; float h2 = 56.05;
float o31 = 23; float o31_ug = 46;
float o31_t = 20; float o31_h = 65;
float no21 = 0; float no21_ug = 0;
float no21_t = 20; float no21_h = 64;
float co1 = 6285; float co1_mg = 6;
float co1_t = 20; float co1_h = 65;
float o32 = 8883; float no22 = 16527;
float co2 = 2331; float co3 = 22000;
float PM1 = 3.85 ; float PM2 = 4.07;
float PM4 = 4.07; float PM10 = 4.07;
// timestamp in measurement string
int year = 2020;
byte month = 11;
byte day = 12;
byte hour = 20;
byte minute = 45;
#else // use real inputs from sensors
float Bat1; float Bat2;
// 3 minute means of measurements
float t1; float h1;
float t2; float h2;
float o31; float o31_ug;
float o31_t; float o31_h;
float no21; float no21_ug;
float no21_t; float no21_h;
float co1; float co1_mg;
float co1_t; float co1_h;
float o32; float no22; float co2;
float PM1; float PM2;
float PM4; float PM10;
// timestamp in measurement string
int year;
byte month;
byte day;
byte hour;
byte minute;
#endif
//============
void setup() {
Serial.begin(9600);
ModemPort.begin(9600);
for (int i = 10; i > 0; i--) {
Serial.print(' '); Serial.print(i);
delay(500);
}
Serial.println();
Serial.println(F("Demo for sending a json measurement string to a Modem."));
Serial.println(F("Based on the SafeString V2.0.8+ library."));
Serial.println();
// Uncomment, if you want to use SoftwareSerial
//jsonOut.connect(ModemPort);
//SafeString::setOutput(ModemPort); // for SafeString Error msg. NOTE: sent to Serial so will block rest of the loop!!
// Comment, if you dont want to test via Serial console
jsonOut.connect(Serial);
SafeString::setOutput(Serial); // for SafeString Error msg. NOTE: sent to Serial so will block rest of the loop!!
}
//============
void loop() {
jsonOut.nextByteOut(); // output next buffered chars. Need to call this at least once each loop
//loopTimer.check(jsonOut);
if (millis() - startMillis >= measurementPeriod) {
startMillis = millis();
SendDataModem(t1, h1, t2, h2, o31, o31_ug, o31_t, o31_h, no21, no21_ug, no21_t, no21_h, co1, co1_mg, co1_t, co1_h, o32, no22, co2, co3, PM1, PM2, PM4, PM10, year, month, day, hour, minute, Bat1, Bat2);
}
}
//============
void SendDataModem(float t1, float h1, float t2, float h2, float Oz1, float Oz1_ug, float Oz1_temp, float Oz1_hum, float NitDio1, float NitDio1_ug, float NitDio1_temp, float NitDio1_hum, float CarMon1, float CarMon1_mg, float CarMon1_temp, float CarMon1_hum, int16_t Oz2, int16_t NitDio2, int16_t CarMon2, int16_t CarMon3, float PartMat1, float PartMat2, float PartMat4, float PartMat10, int yyyy, byte mon, byte dd, byte hh, byte mm, float AdaBat, float ModemBat) {
cSF(jsonMsg, 400);
jsonMsg.print(F("{\"Id\":")); jsonMsg.print(Number); jsonMsg.print(F(","));
jsonMsg.print(F("\"Y\":")); jsonMsg.print(yyyy); jsonMsg.print(F(","));
jsonMsg.print(F("\"M\":")); jsonMsg.print(mon); jsonMsg.print(F(","));
jsonMsg.print(F("\"D\":")); jsonMsg.print(dd); jsonMsg.print(F(","));
jsonMsg.print(F("\"Hr\":")); jsonMsg.print(hh); jsonMsg.print(F(","));
jsonMsg.print(F("\"Mi\":")); jsonMsg.print(mm); jsonMsg.print(F(","));
jsonMsg.print(F("\"B1\":")); jsonMsg.print(AdaBat); jsonMsg.print(F(","));
jsonMsg.print(F("\"B2\":")); jsonMsg.print(ModemBat); jsonMsg.print(F(","));
jsonMsg.print(F("\"T1\":")); jsonMsg.print(t1); jsonMsg.print(F(","));
jsonMsg.print(F("\"H1\":")); jsonMsg.print(h1); jsonMsg.print(F(","));
jsonMsg.print(F("\"T2\":")); jsonMsg.print(t2); jsonMsg.print(F(","));
jsonMsg.print(F("\"H2\":")); jsonMsg.print(h2); jsonMsg.print(F(","));
jsonMsg.print(F("\"O1\":")); jsonMsg.print(Oz1); jsonMsg.print(F(","));
jsonMsg.print(F("\"O1g\":")); jsonMsg.print(Oz1_ug); jsonMsg.print(F(","));
jsonMsg.print(F("\"O1t\":")); jsonMsg.print(Oz1_temp); jsonMsg.print(F(","));
jsonMsg.print(F("\"O1h\":")); jsonMsg.print(Oz1_hum); jsonMsg.print(F(","));
jsonMsg.print(F("\"N1\":")); jsonMsg.print(NitDio1); jsonMsg.print(F(","));
jsonMsg.print(F("\"N1g\":")); jsonMsg.print(NitDio1_ug); jsonMsg.print(F(","));
jsonMsg.print(F("\"N1t\":")); jsonMsg.print(NitDio1_temp); jsonMsg.print(F(","));
jsonMsg.print(F("\"N1h\":")); jsonMsg.print(NitDio1_hum); jsonMsg.print(F(","));
jsonMsg.print(F("\"C1\":")); jsonMsg.print(CarMon1); jsonMsg.print(F(","));
jsonMsg.print(F("\"C1g\":")); jsonMsg.print(CarMon1_mg); jsonMsg.print(F(","));
jsonMsg.print(F("\"C1t\":")); jsonMsg.print(CarMon1_temp); jsonMsg.print(F(","));
jsonMsg.print(F("\"C1h\":")); jsonMsg.print(CarMon1_hum); jsonMsg.print(F(","));
jsonMsg.print(F("\"O2\":")); jsonMsg.print(Oz2); jsonMsg.print(F(","));
jsonMsg.print(F("\"N2\":")); jsonMsg.print(NitDio2); jsonMsg.print(F(","));
jsonMsg.print(F("\"C2\":")); jsonMsg.print(CarMon2); jsonMsg.print(F(","));
jsonMsg.print(F("\"C3\":")); jsonMsg.print(CarMon3); jsonMsg.print(F(","));
jsonMsg.print(F("\"P1\":")); jsonMsg.print(PartMat1); jsonMsg.print(F(","));
jsonMsg.print(F("\"P2\":")); jsonMsg.print(PartMat2); jsonMsg.print(F(","));
jsonMsg.print(F("\"P4\":")); jsonMsg.print(PartMat4); jsonMsg.print(F(","));
jsonMsg.print(F("\"P10\":")); jsonMsg.print(PartMat10); jsonMsg.println(F("}"));
jsonOut.clearSpace(jsonMsg.length()); // clear space for this message in the buffer
jsonOut.print(jsonMsg);
jsonOut.protect(); // prevent other clearSpace() calls from removing parts of this output
//sending_measurement = false; // sending data is done
}
The output:
20:23:14.651 -> 2 1 10 9 8 7 6 5 4 3 2 1
20:23:20.533 -> Demo for sending a json measurement string to a Modem.
20:23:20.567 -> Based on the SafeString V2.0.8+ library.
20:23:20.633 ->
20:23:20.633 -> {"Id":1,"Y":2020,"M":11,"D":12,"Hr":20,"Mi":45,"B1":3.64,"B2":3.67,"T1":20.53,"H1":66.16,"T2":20.92,"H2":56.05,"O1":23.00,"O1g":46.00,"O1t":20.00,"O1h":65.00,"N1":0.00,"N1g":0.00,"N1t":20.00,"N1h":64.00,"C1":6285.00,"C1g":6.00,"C1t":20.00,"C1h":65.00,"O2":8883,"N2":16527,"C2":2331,"C3":22000,"P1":3.85,"P2":4.07,"P4":4.07,"P10":4.07}
20:23:22.624 -> {"Id":1,"Y":2020,"M":11,"D":12,"Hr":20,"Mi":45,"B1":3.64,"B2":3.67,"T1":20.53,"H1":66.16,"T2":20.92,"H2":56.05,"O1":23.00,"O1g":46.00,"O1t":20.00,"O1h":65.00,"N1":0.00,"N1g":0.00,"N1t":20.00,"N1h":64.00,"C1":6285.00,"C1g":6.00,"C1t":20.00,"C1h":65.00,"O2":8883,"N2":16527,"C2":2331,"C3":22000,"P1":3.85,"P2":4.07,"P4":4.07,"P10":4.07}
20:23:24.619 -> {"Id":1,"Y":2020,"M":11,"D":12,"Hr":20,"Mi":45,"B1":3.64,"B2":3.67,"T1":20.53,"H1":66.16,"T2":20.92,"H2":56.05,"O1":23.00,"O1g":46.00,"O1t":20.00,"O1h":65.00,"N1":0.00,"N1g":0.00,"N1t":20.00,"N1h":64.00,"C1":6285.00,"C1g":6.00,"C1t":20.00,"C1h":65.00,"O2":8883,"N2":16527,"C2":2331,"C3":22000,"P1":3.85,"P2":4.07,"P4":4.07,"P10":4.07}
20:23:26.644 -> {"Id":1,"Y":2020,"M":11,"D":12,"Hr":20,"Mi":45,"B1":3.64,"B2":3.67,"T1":20.53,"H1":66.16,"T2":20.92,"H2":56.05,"O1":23.00,"O1g":46.00,"O1t":20.00,"O1h":65.00,"N1":0.00,"N1g":0.00,"N1t":20.00,"N1h":64.00,"C1":6285.00,"C1g":6.00,"C1t":20.00,"C1h":65.00,"O2":8883,"N2":16527,"C2":2331,"C3":22000,"P1":3.85,"P2":4.07,"P4":4.07,"P10":4.07}