SEN0657 code sample is broken- here is a fixed version

The sample code provided does not compile with latest Arduino. It's got functions that are declared void returning a value. Secondly, the functions to read light, pressure and the wind speed/direction reference array elements beyond the declared size, which results in an ESP32 Stack Smash reboot.
Code below works, but have not tested for accuracy .
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //TX,RX
uint8_t Com[8] = { 0x01, 0x03, 0x01, 0xF4, 0x00, 0x04, 0x04, 0x07 }; //Wind speed and direction
uint8_t Com1[8] = { 0x01, 0x03, 0x01, 0xF8, 0x00, 0x02, 0x44, 0x06 }; //Temperature and humidity
uint8_t Com2[8] = { 0x01, 0x03, 0x01, 0xFD, 0x00, 0x03, 0x95, 0xC7 }; //Atmospheric pressure, light
uint8_t Com3[8] = { 0x01, 0x03, 0x02, 0x01, 0x00, 0x01, 0xD4, 0x72 }; //Rainfall
float tem, hum, ws, ap, Rain;
int wd, wdangle, lux, dummy;
void setup() {
Serial.begin(115200);
mySerial.begin(4800);
}
void loop() {
dummy=readhumiture();
Serial.print("TEM = ");
Serial.print(tem, 1);
Serial.print("°C ");
Serial.print("HUM = ");
Serial.print(hum, 1);
Serial.print("%RH ");
Serial.flush();
dummy=readAtmosphericPressure_Light();
Serial.print("AP = ");
Serial.print(ap, 1);
Serial.print("Kpa ");
Serial.print("Lux = ");
Serial.print(lux);
Serial.print("(lux) ");
Serial.flush();
Rain = readRainfall();
Serial.print("Rain = ");
Serial.print(Rain, 1);
Serial.println("mm ");
Serial.flush();
dummy = readWindSpeed_WindDirection();
Serial.print("Wind Speed = ");
Serial.print(ws, 1);
Serial.print("m/s ");
Serial.print("Wind Direction = ");
Serial.print(wd);
Serial.print(" WindDirection_Angle = ");
Serial.print(wdangle);
Serial.println("° ");
Serial.println(" ");
Serial.flush();
delay(2000);
}
int readWindSpeed_WindDirection(void) {
uint8_t Data[13] = { 0 };
uint8_t ch = 0;
bool flag = 1;
long timeStart = millis();
long timeStart1 = 0;
while (flag) {
if ((millis() - timeStart1) > 100) {
while (mySerial.available() > 0) {
mySerial.read();
}
mySerial.write(Com, 8);
timeStart1 = millis();
}
if ((millis() - timeStart) > 1000) {
Serial.println("Time out");
return -1;
}
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x08) {
Data[2] = ch;
if (readN(&Data[3], 10) == 10) {
if (CRC16_2(Data, 11) == (Data[11] * 256 + Data[12])) {
ws = (Data[3] * 256 + Data[4]) / 100.00;
wd = Data[7] * 256 + Data[8];
wdangle = Data[9] * 256 + Data[10];
flag = 0;
}
}
}
}
}
}
}
}
}
return 1;
}
int readhumiture(void) {
uint8_t Data[10] = { 0 };
uint8_t ch = 0;
bool flag = 1;
long timeStart = millis();
long timeStart1 = 0;
while (flag) {
if ((millis() - timeStart1) > 100) {
while (mySerial.available() > 0) {
mySerial.read();
}
mySerial.write(Com1, 8);
timeStart1 = millis();
}
if ((millis() - timeStart) > 1000) {
Serial.println("Time out1");
return -1;
}
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x04) {
Data[2] = ch;
if (readN(&Data[3], 6) == 6) {
if (CRC16_2(Data, 7) == (Data[7] * 256 + Data[8])) {
hum = (Data[3] * 256 + Data[4]) / 10.00;
tem = (Data[5] * 256 + Data[6]) / 10.00;
flag = 0;
}
}
}
}
}
}
}
}
}
return 1;
}
int readAtmosphericPressure_Light(void) {
uint8_t Data[11] = { 0 };
uint8_t ch = 0;
long timeStart = millis();
long timeStart1 = 0;
bool flag = 1;
while (flag) {
if ((millis() - timeStart1) > 100) {
while (mySerial.available() > 0) {
mySerial.read();
}
mySerial.write(Com2, 8);
timeStart1 = millis();
}
if ((millis() - timeStart) > 1000) {
Serial.println("Time out2");
return -1;
}
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x06) {
Data[2] = ch;
if (readN(&Data[3], 8) == 8) {
if (CRC16_2(Data, 9) == (Data[9] * 256 + Data[10])) {
ap = (Data[3] * 256 + Data[4]) / 10.00;
lux = Data[5] << 24 | Data[6] << 16 | Data[7] << 8 | Data[8];
flag = 0;
}
}
}
}
}
}
}
}
}
return 1;
}
float readRainfall(void) {
uint8_t Data[10] = { 0 };
uint8_t ch = 0;
long timeStart = millis();
long timeStart1 = 0;
bool flag = 1;
float data;
while (flag) {
if ((millis() - timeStart1) > 100) {
while (mySerial.available() > 0) {
mySerial.read();
}
mySerial.write(Com3, 8);
timeStart1 = millis();
}
if ((millis() - timeStart) > 1000) {
Serial.println("Time out3");
return -1;
}
if (readN(&ch, 1) == 1) {
if (ch == 0x01) {
Data[0] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x03) {
Data[1] = ch;
if (readN(&ch, 1) == 1) {
if (ch == 0x02) {
Data[2] = ch;
if (readN(&Data[3], 4) == 4) {
if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {
data = (Data[3] * 256 + Data[4]) / 10.00;
flag = 0;
}
}
}
}
}
}
}
}
}
return data;
}
uint8_t readN(uint8_t *buf, size_t len) {
size_t offset = 0, left = len;
int16_t Tineout = 500;
uint8_t *buffer = buf;
long curr = millis();
while (left) {
if (mySerial.available()) {
buffer[offset] = mySerial.read();
offset++;
left--;
}
if (millis() - curr > Tineout) {
break;
}
}
return offset;
}
unsigned int CRC16_2(unsigned char *buf, int len) {
unsigned int crc = 0xFFFF;
for (int pos = 0; pos < len; pos++) {
crc ^= (unsigned int)buf[pos];
for (int i = 8; i != 0; i--) {
if ((crc & 0x0001) != 0) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
return crc;
}