Part Number: LAUNCHXL-F28069M
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?

