Other Parts Discussed in Thread: CONTROLSUITE, SFRA
Tool/software: Code Composer Studio
Hello all,
I have written a program which communicates with a pc interface via sci. Sci sends my launchxl some chars and I need to convert those into integer/float etc.
Just math.h is included.
I have some problems with these calculations. The subroutine below is being called by a for loop for every sci character I get. I know it is not the best char to number converter algorithm but anyway. :)
int whatcomesnext=0; Uint16 bytecounter=0; Uint16 sdataA[8]; Uint16 rdataA[8]; Uint32 result=0; float32 value; float32 divider; float32 division;
void stringToNumeric() { if (SciaRegs.SCIRXEMU == 48) { whatcomesnext=0; } else if (SciaRegs.SCIRXEMU == 49) { whatcomesnext=1; } else if (SciaRegs.SCIRXEMU == 50) { whatcomesnext=2; } else if (SciaRegs.SCIRXEMU == 51) { whatcomesnext=3; } else if (SciaRegs.SCIRXEMU == 52) { whatcomesnext=4; } else if (SciaRegs.SCIRXEMU == 53) { whatcomesnext=5; } else if (SciaRegs.SCIRXEMU == 54) { whatcomesnext=6; } else if (SciaRegs.SCIRXEMU == 55) { whatcomesnext=7; } else if (SciaRegs.SCIRXEMU == 56) { whatcomesnext=8; } else if (SciaRegs.SCIRXEMU == 57) { whatcomesnext=9; } else if (SciaRegs.SCIRXEMU == 44 || SciaRegs.SCIRXEMU == 46) { whatcomesnext=","; } else { whatcomesnext=0; } if(SciaRegs.SCIRXEMU>10 && SciaRegs.SCIRXEMU!=32 && SciaRegs.SCIRXEMU!=13 && SciaRegs.SCIRXEMU!=44 && SciaRegs.SCIRXEMU!=46 && bytecounter <=7) { bytecounter=bytecounter+1; if(bytecounter>=1) { rdataA[bytecounter]=whatcomesnext; } } else if (SciaRegs.SCIRXEMU!=44 && SciaRegs.SCIRXEMU!=46) { bytecounter=0; result = 0; division = 0; } if (bytecounter==1) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*10000000; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =100000000; } } else if (bytecounter==2) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*1000000; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =10000000; } } else if (bytecounter==3) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*100000; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =1000000; } } else if (bytecounter==4) { if (whatcomesnext >=0 && whatcomesnext<=9) { float32 value1 = whatcomesnext*100; value=value1*100; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =100000; } } else if (bytecounter==5) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*1000; result = value+result; } if (SciaRegs.SCIRXEMU!=44 && SciaRegs.SCIRXEMU!=46) { divider =10000; } } else if (bytecounter==6) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*100; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =1000; } } else if (bytecounter==7) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext*10; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =100; } } else if (bytecounter==8) { if (whatcomesnext >=0 && whatcomesnext<=9) { value = whatcomesnext; result = value+result; } if (SciaRegs.SCIRXEMU==44 && SciaRegs.SCIRXEMU==46) { divider =10; } } }
"value" is always correct but "result" is not. When I send 11111111 or 22222222, it is ok. Result is correct. But for 33333333, result becomes 33333334. For 99999999, result = 100000000.
So I need a correct result and according to my result, I will divide and get another value. (33,25 or 77,358 etc. Some float parameter values)
I think math.h is not enough. I have read CLA and IQmath but could not use them properly. What do you suggest to improve the calculation accuracy?