Вобщем-то надо перевести последовательность байтов в число. Имеем код:
- Код: Выделить всё
unsigned int USART1_ReceiveInt (unsigned char * last_char)
{
unsigned char chars[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned int temp = 0; //Сюда число собираем
unsigned char timer = 0; //Это таймер по которому мы читаем символы
unsigned char timer2 = 0; //Это таймер по которому мы собираем из массива данных число.
unsigned char length=0; //Это переменная вместо которой раньше использовался первый таймер, длинна считанного вобщем
unsigned char current_char = 0; //Текущий символ
for (timer=0; timer<8; timer++) //Читаем до восьми символов
{
current_char = USART1_Receive();//Эта функция хоть убейся, но отдаст какой-нибудь символ, тут проблем нет.
if ((current_char>47) & (current_char<58))//Смотрем циферка ли
{
length++;//считаем длинну
chars[timer] = current_char-48;//записываем в массив цифру
}
else
{
*last_char=current_char;//если считали не то, то запомним для разбора полетов и идём на выход.
break;
}
}
for (timer2=0;timer2<length;timer2++) //Пробегаем по массиву и суммируем по разрядам.
{
switch (length-1-timer2)
{
case 0:
temp=temp+chars[timer2];
break;
case 1:
temp=temp+chars[timer2]*10;
break;
case 2:
temp=temp+chars[timer2]*100;
break;
case 3:
temp=temp+chars[timer2]*1000;
break;
case 4:
temp=temp+chars[timer2]*10000;
break;
case 5:
temp=temp+chars[timer2]*100000;
break;
case 6:
temp=temp+chars[timer2]*1000000;
break;
case 7:
temp=temp+chars[timer2]*10000000;
break;
default:
;
}
// temp=temp+chars[timer2]*(10^(length-1-timer2));
}
return temp;
}
Вопрос в том, почему вот этот кейсовый монстр работает, а тот вариант что закоментирован снизу нифига не пашет? Или как менее ненормально можно реализовать подобную задачу.
PS Сорри за выбор раздела, в алгоритмы вроде бестолку, тут просто хочется совета спросить. В C# тоже не катит потому что не C# тут нифига.