roboforum.ru

Технический форум по робототехнике.

Передача данных

Re: Передача данных

Korbofos » 28 июн 2012, 15:43

А как это в буфер уарта загнать?

Re: Передача данных

dccharacter » 28 июн 2012, 15:53

использовать библиотечную функцию UART_ZagnatVBuffer()
Только не забудь включить поддержку C99 в компиляторе и убрать оптимизацию

Re: Передача данных

elmot » 28 июн 2012, 19:45

dccharacter писал(а):
Korbofos писал(а):Я хочу увить значение в десятичном виде

О, маладца. Как насчет printf, sprintf?

unsigned char var = 0x31;
printf("Значение в десятичном виде переменной var: %u", var);

Вывод:
Значение в десятичном виде переменной var: 49

в принципе itoa - это правильно. Можно и printf, но тогда лучше без русского языка, а то начнется извечный гемор с кодировками

Re: Передача данных

Korbofos » 29 июн 2012, 07:35

как-то так?
Код: Выделить всёРазвернуть
char str[16];
unsigned char a=200;

itoa (a, str, 10);
usart_write(str);

void usart_write(unsigned char data)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index++]=data;
   if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=data;
#asm("sei")
}

Re: Передача данных

elmot » 29 июн 2012, 07:57

Это даже компилиться не должно. функция принимает один символ, а ей передают массив

Re: Передача данных

Korbofos » 29 июн 2012, 08:15

Код: Выделить всёРазвернуть
for(i=0;i<???;i++) //scanf ещё нужно определить конец строки?
{
usart_write(str[i]);
}

Re: Передача данных

elmot » 29 июн 2012, 10:13

Аллах с тобой, scanf не для этого вообще. По стандарту C конец строки обозначается нулевым байтом.
for(i=0;data[i]!=0;i++)

Добавлено спустя 5 минут 4 секунды:
dccharacter писал(а):О, маладца. Как насчет printf, sprintf?

Не смущай неокрепшие умы. не sprintf, а snprintf. Половина взомов в этих ваших энторнетах проделаны через неотслеженную длинну строк. Не говоря уже о миллиардах просто багов.

Re: Передача данных

dccharacter » 29 июн 2012, 12:07

бе бе бе
у меня у самого ум не сильно окрепший

Re: Передача данных

Korbofos » 29 июн 2012, 17:08

Код: Выделить всёРазвернуть
unsigned char var=100;
char str[16];
snprintf(str,16,"Var%d",var);
for(i=0;str[i]!=0;i++)
{
usart_write(str[i]);
}

emlot так кошерно?

Добавлено спустя 21 минуту 36 секунд:
И обратный процесс.
Код: Выделить всёРазвернуть
 
char str
switch(usart_read())
case 's':
for(i=0;i<3;i++) //нужно дочитать несколько байт
{str[i]=usart_read();}
var=atoi(str);
//bla bla

Последний раз редактировалось Korbofos 29 июн 2012, 17:20, всего редактировалось 1 раз.

Re: Передача данных

dccharacter » 29 июн 2012, 17:19

1) у тебя переменная UNSIGNED, а модификатор - SIGNED. Соответственно если ты попытаешься вывести значение 129, то в терминале увидишь -1. Используй модификатор %u
2) тип возвращаемого значения функции указывается только при объявлении и определении функций
3) зато функция sprint(n)f возвращает количество записанных в буффер байт, т.е. не надо каждый символ проверять на ноль, надо просто возвращенное функцией количество раз сунуть байт в УАРТ.

Код: Выделить всёРазвернуть
unsigned char var=129;
char str[16];
int str_length = 0;
str_length = snprintf(str,16,"Var %u",var);

while (str_length--) usart_write(str[str_length]);


Хотя там странное что-то возвращает: Number of characters written if successful or negative value if an error occurred. If the resulting string gets truncated due to buf_size limit, function returns the total number of characters (not including the terminating null-byte) which would have been written, if the limit was not imposed.

Добавлено спустя 1 минуту 31 секунду:
по-моему я дважды налетел на OBO - off by one
так и не научился это четко определять :-)

Добавлено спустя 1 минуту 28 секунд:
Код: Выделить всёРазвернуть
unsigned char var=129;
char str[16];
int str_length = 0;
str_length = snprintf(str,16,"Var %u",var);

for (int i = 0; i < str_length; i++)
{
   usart_write(str[i]);
}

Re: Передача данных

legion » 29 июн 2012, 17:46

Чурменя, чурменя, чурменя, OUT UDR,R17.

Re: Передача данных

dccharacter » 29 июн 2012, 17:54

Вообще я какую-то хрень написал :-)
Причем даже не задумался над тем, как эти функции у меня написаны

Код: Выделить всёРазвернуть
void rs232_putch (char txByte)
{
   while (!TXIF);
   TXREG = txByte;
}

char rs232_getch (void)
{
   if (!RCIF) return -1;
   if (FERR) return -2;
   return    RCREG;
}   

void rs232_puts (const char * txstr)
{
   while (*txstr)
   {
       rs232_putch(*txstr++);
   }
}
Последний раз редактировалось dccharacter 29 июн 2012, 21:28, всего редактировалось 1 раз.

Re: Передача данных

Korbofos » 29 июн 2012, 18:30

dccharacter а как читаете пришедшие байты и передаёте их в какую либо функцию?

Re: Передача данных

dccharacter » 29 июн 2012, 18:34

ну я не с терминала отправляю
т.е. я уже шлю байты форматированные
например посылка {0x73, 0x05, 0xFF, 0xF0, 0x70}
0x73 = 's', начало посылки
0x05 - адрес регистра, куда класть значение int
0xFF, 0xF0 - старший и младший байты значения int
0х70 = 'p', конец посылки

но это все без учета сбоев, понятное дело.

Re: Передача данных

boez » 29 июн 2012, 18:35

dccharacter писал(а):If the resulting string gets truncated ... returns the total number of characters ... which would have been written, if the limit was not imposed.

Афигеть - вот этого не знал, думал выдаст скоко реально записано. С одной стороны правильно, размер буфера мы и так знаем, а тут полезная инфа - насколько буфер надо расширить чтоб влезло. А с другой стороны, передавать результат snprintf в следующую функцию ( к примеру передачи в уарт n байт) еще сложнее - нужна проверка не только на минус, но и на больше буфера.


cron
Rambler\'s Top100 Mail.ru counter