Index: webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c =================================================================== --- webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c (revision 70) +++ webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c (revision 71) @@ -270,5 +270,5 @@ for (i = 0; i < NUMBER_OF_SOLAR_CHANNELS; i++) { - dayRxYield[i] = 0; + dayRxYield[i] = 65535; /* default: invalid/unset value */ } /* for */ @@ -450,5 +450,5 @@ unsigned char power; /* variable for conversions */ unsigned char checkDate; /* temp variable for day of month */ - + unsigned char rxYieldChkSum; /* temp checksum for rx yield */ /* always get Rx data */ @@ -616,9 +616,10 @@ else if ((scDate[1] == 1) || - (scDate[1] == 5) || - (scDate[1] == 7) || - (scDate[1] == 8) || - (scDate[1] == 10) || - (scDate[1] == 12)) + (scDate[1] == 1+1) || + (scDate[1] == 3+1) || + (scDate[1] == 5+1) || + (scDate[1] == 7+1) || + (scDate[1] == 8+1) || + (scDate[1] == 10+1)) { checkDate = 31; @@ -660,19 +661,38 @@ if (cmpResult == 0) { - /* we have got a match! */ - - if (currentChannel <= 5) + /* we have got a match (i.e. expected frame received) ! */ + + /* calculate the checksum of the received data */ + + rxYieldChkSum = calculate_crc8( (&(rxUART3[0])), (sizeof(yield_day_rsp)-2)); + + if (rxYieldChkSum == rxUART3[17]) { - - - dayRxYield[currentChannel] = - extractBinaryHexDigitString( &(rxUART3[0]), 13, 16 ); - - } /* if */ + /* checksum is correct! */ + + if (currentChannel <= 5) + { + + /* convert and copy value */ + dayRxYield[currentChannel] = + extractBinaryHexDigitString( &(rxUART3[0]), 13, 16 ); + + } /* if */ + else + { + /* all channels done. nothing to do, we leave via SOL_QUERY_YIELD */ + } + } + else if (currentChannel <= 5) + { + /* valid channel index. but checksum is incorrect ! */ + dayRxYield[currentChannel] = 65535; /* invalid value */ + } else { - /* all channels done. nothing to do, we leave via SOL_QUERY_YIELD */ + /* checksum incorrect and channel index out of range. do nothing. */ } + /* always move on to the next value... */ currentChannel++; /* increment channel counter so we query the next channel in the next round */