Hello,
I've this basic project with couple simple components:
-Arduino UNO v3
-SI4432 module with spring antenna (link to module)
-Bosch BME280
-Ublox Neo-7M GPS (link to module)
Goal: to transmit GPS+Sensor data at regular intervals (1hz) to RX station.
Current status: I've setup everything and it works fine with basic setup with low TX power of 1 or 2dBm (RH_RF22_TXPOW_2DBM). I can succesfully send ~100 byte string data to another Arduino module
Setup:
FC=434 Mhz
Mod: GFSK_Rb2_4Fd36
Problems:
1) Can't seem to send data with 20dbm. When main loop starts it only sends 2-3 messages then stops (as seen in the serial output). Tried numerous other data rates and modulation types. (transmit.png)
2) How do I ensure proper reception of message? Sometimes, as distance increases between transmitter and receiver (also as I change power output on the transmitter), the message becomes garbled and parts of the message appear as junk on the serial output of the other Arduino. Is this serial port, transmission (improper message forming) or RF distortion (packet loss) issue? I'm testing modules side-by-side ~1m away from each other. I'd rather prefer the whole string lost to garbled msg. (receive.png)
Here's how I form the message:
String data;
data += String(fix.dateTime.year);
data += ",";
data += String(fix.dateTime.month);
data += ",";
data += String(fix.dateTime.date);
data += ",";
data += String(fix.dateTime.hours);
data += ",";
data += String(fix.dateTime.minutes);
data += ",";
data += String(fix.dateTime.seconds);
data += ",";
data += String(fix.latitude(),6);
data += ",";
data += String(fix.longitude(),6);
data += ",";
data += String(fix.altitude());
data += ",";
data += String(fix.heading());
data += ",";
data += String(fix.speed_kph());
data += ",";
data += String(fix.heading());
data += ",";
data += String(fix.satellites);
data += ",";
data += String(bme.readTemperature());
data += ",";
data += String(bme.readPressure() / 100.0F);
data += ",";
data += String(bme.readAltitude(SEALEVELPRESSURE_HPA));
data += ",";
data += String(bme.readHumidity());
data += ",";
data += String(Tn);
//send data
char sdata[100];
data.toCharArray(sdata, 100); // Converted String to char.
rf22.send((uint8_t *)sdata, sizeof(sdata)); //typecast to uint8_t
//receive data
if (rf22.available())
{
uint8_t buf[RH_RF22_MAX_MESSAGE_LEN]; //RH_RF22_MAX_MESSAGE_LEN=100
uint8_t len = sizeof(buf);
if (rf22.recv(buf, &len))
{
Serial.print((char*)buf);
Serial.print(",");
Serial.println(-120+rf22.rssiRead()/2); //RSSI
3) I want to increase reception distance to ~50km LOS (possibly more)
-Will have quarter wave antenna at the TX (20dbm, if i can make it)
-At the RX side, will use Yagi antenna (>10dBi), LNA (~30dB) and si4432 module connected with SMA.
Simple link budget analysis says even 100km is possible, but is it really with the setup above?
Thanks a lot!

