Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Опять Atiny2313 и COM-PORT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
GoldZ
Прошу помощи, светлых мыслей, указания куда идти!
Стоит задача:
послать в МК цифру;
исполнить подпрограмму несколько раз согласно полученной цифры.

Посылаю цифру в виде строки(в виде цифры не умею)
Дальше, по логике нужно эту строку превратить в цифру и
создать цикл. В теле цикла вставить вызов подпрограммы.

Тормоза наступили на уровне преобразования строки в цифру
Dimmy
Если C-код - пользуем ф-ю
#include <stdlib.h>
int atoi( const char *str );

Если нет в библиотеках - то что-то вроде:
Код
unsigned int MyAtoi(char * InString)
{
   unsigned char
                          i;
                          
   unsigned int
                        Result,
            Multiplier;
   Result=0;
   Multiplier = 1;
   while(InStr[i])
   {
      Result += (InStr[i++]-0x30) * Multiplier;
      Multiplier *= 10;
   }
  return Result;
}

Да, еще, для моей и библиотечной ф-ции строка должна быть нуль-терминальной
GoldZ
Делаю
#include <stdlib.h>

int atoi( const char *str );


#include <tiny2313.h>
#include <stdlib.h>
#include <stdio.h>

long nn;
char skoko;
long int atol(char *str);


//Прием данных

#define RXC 7
unsigned char USART_Receive( void )
{
/* Ожидаем пока данные будут получены */
while (! (UCSRA & (1<<RXC)) );
/* Читаем данные из буфера и возвращаем их при выходе из подпрограммы */
return UDR;
}
//Передача данных
#define UDRE 5
void USART_Transmit( unsigned char data )
{
/* Ожидаем, пока очистится буфер передачи */
while ( !( UCSRA & (1<<UDRE)) );
/* Помещаем данные в буфер. Начинается передача */
UDR = data;
}


skoko=USART_Receive()
nn=atol(skoko);

РЕЗУЛЬТАТ- Не совпадение типов char и *char
Dimmy
Ну во первых: результат skoko - это не строка, а один байт
Во вторых - нехорошо висеть постоянно в пп приема данных
Если идти по вашему пути - то надо организовывать внешний буфер (Buf[64]) для приема строки (где-то 64 байта например),
и постепенно его заполнять. Ф-я USART_receive должна возвращать что-то типа BOOL. Если принят символ / не принят вообще - то FALSE, а как-только приняли 0 (конец строки) - то добавляем его в буфер и возвращаем TRUE. После этого вызываете atoi(Buf);
if (USART_Receive()) nn=atoi[Buf];
Повторяю - СТРОКА ЗАКАНЧИВАЕТСЯ НУЛЕМ!
Еще - вы передаете данные именно как строку (т.е. цифра 0 - это 0x30, цифра 1 - это 0x31...), или все-таки как число - может тогда и преобразовывать не надо ничего...
GoldZ
Цитата(Dimmy @ Jul 16 2007, 17:22) *
Ну во первых: результат skoko - это не строка, а один байт
Во вторых - нехорошо висеть постоянно в пп приема данных
Если идти по вашему пути - то надо организовывать внешний буфер (Buf[64]) для приема строки (где-то 64 байта например),
и постепенно его заполнять. Ф-я USART_receive должна возвращать что-то типа BOOL. Если принят символ / не принят вообще - то FALSE, а как-только приняли 0 (конец строки) - то добавляем его в буфер и возвращаем TRUE. После этого вызываете atoi(Buf);
if (USART_Receive()) nn=atoi[Buf];
Повторяю - СТРОКА ЗАКАНЧИВАЕТСЯ НУЛЕМ!
Еще - вы передаете данные именно как строку (т.е. цифра 0 - это 0x30, цифра 1 - это 0x31...), или все-таки как число - может тогда и преобразовывать не надо ничего...

Глупый, но вопрос
Как добавить в буффер????
IEC
Цитата(GoldZ @ Jul 17 2007, 03:50) *
Глупый, но вопрос
Как добавить в буффер????

Наверное дам глупый ответ, но постараюсь:
- создаете буфер ( buf[255] )
- перед началом приема посылки инициализируете некую переменную - счетчик принятых байт (bNumb=0)
- принимая очередной байт, пишите его в буфер ( buf[bNumb++] = UDR )
- принимая данные проверяете буфер на переполнение ( bNumb < 255 )
- после завершения приема посылки формируете завершение строки ( buf[bNumb] = 0х00 )

Надеюсь я ответил на ваш вопрос biggrin.gif .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.