Index: webserver/example/EnergyMeters/Source/serial.c =================================================================== --- webserver/example/EnergyMeters/Source/serial.c (revision 37) +++ webserver/example/EnergyMeters/Source/serial.c (revision 72) @@ -224,5 +224,5 @@ - unsigned int baud = 57600; + unsigned int baud = 2400; unsigned int divisor = get_uart_clk(3, OSCILLATOR_CLOCK_FREQUENCY) / (16 * baud); Index: webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c =================================================================== --- webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c (revision 71) +++ webserver/example/EnergyMeters/Source/EnergyMeters/SolarCountUART.c (revision 72) @@ -929,5 +929,5 @@ { - unsigned int baud = 57600; + unsigned int baud = 2400; unsigned int divisor = get_uart_clk(3, OSCILLATOR_CLOCK_FREQUENCY) / (16 * baud); @@ -1203,19 +1203,40 @@ ) { + unsigned char currentChar; + unsigned char conversionError = 0; unsigned char x; int resultValue = 0; /* initial value */ unsigned char round = 0; /* which digit? 0 = LSB */ - unsigned char currentCharValue; + int currentCharValue; /* go through the bytes backwards (least significant to most significant) */ for (x = lastSrcByte; x >= firstSrcByte; x--) { - - currentCharValue = (srcDataStart[x]) - 0x30; + currentChar = srcDataStart[x]; + if ((currentChar < 0x30) || (currentChar > 0x46)) + { + conversionError = 1; + } + else if (currentChar <= 0x39) + { + // 0x0 to 0x9 + currentCharValue = (srcDataStart[x]) - 0x30; + } + else + { + // 0xA to 0xF + currentCharValue = 0xA + ((srcDataStart[x]) - 0x41); + } resultValue = resultValue + (currentCharValue << (4 * round)); round++; } /* for */ + + /* if a conversion error occurred, nullify the result */ + if (conversionError == 1) + { + resultValue = 0xFFFF; + } return resultValue;