Технический форум по робототехнике.
Korbofos » 28 июн 2012, 15:43
А как это в буфер уарта загнать?
dccharacter » 28 июн 2012, 15:53
использовать библиотечную функцию UART_ZagnatVBuffer()
Только не забудь включить поддержку C99 в компиляторе и убрать оптимизацию
elmot » 28 июн 2012, 19:45
dccharacter писал(а):Korbofos писал(а):Я хочу увить значение в десятичном виде
О, маладца. Как насчет printf, sprintf?
unsigned char var = 0x31;
printf("Значение в десятичном виде переменной var: %u", var);
Вывод:
Значение в десятичном виде переменной var: 49
в принципе itoa - это правильно. Можно и printf, но тогда лучше без русского языка, а то начнется извечный гемор с кодировками
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")
}
elmot » 29 июн 2012, 07:57
Это даже компилиться не должно. функция принимает один символ, а ей передают массив
Korbofos » 29 июн 2012, 08:15
- Код: Выделить всё • Развернуть
for(i=0;i<???;i++) //scanf ещё нужно определить конец строки?
{
usart_write(str[i]);
}
elmot » 29 июн 2012, 10:13
Аллах с тобой, scanf не для этого вообще. По стандарту C конец строки обозначается нулевым байтом.
for(i=0;data[i]!=0;i++)
Добавлено спустя 5 минут 4 секунды:dccharacter писал(а):О, маладца. Как насчет printf, sprintf?
Не смущай неокрепшие умы. не sprintf, а snprintf. Половина взомов в этих ваших энторнетах проделаны через неотслеженную длинну строк. Не говоря уже о миллиардах просто багов.
dccharacter » 29 июн 2012, 12:07
бе бе бе
у меня у самого ум не сильно окрепший
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 раз.
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]);
}
legion » 29 июн 2012, 17:46
Чурменя, чурменя, чурменя, OUT UDR,R17.
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 раз.
Korbofos » 29 июн 2012, 18:30
dccharacter а как читаете пришедшие байты и передаёте их в какую либо функцию?
dccharacter » 29 июн 2012, 18:34
ну я не с терминала отправляю
т.е. я уже шлю байты форматированные
например посылка {0x73, 0x05, 0xFF, 0xF0, 0x70}
0x73 = 's', начало посылки
0x05 - адрес регистра, куда класть значение int
0xFF, 0xF0 - старший и младший байты значения int
0х70 = 'p', конец посылки
но это все без учета сбоев, понятное дело.
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 байт) еще сложнее - нужна проверка не только на минус, но и на больше буфера.