реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Опять UART и строки
mr_ia
сообщение May 7 2008, 03:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Доброе время суток уважаемые.
Подскажите по применению нескольких функций, желательно на присоединенном примере.
1) Ввод строки через gets. Если указать gets(buffer,10); то нормально читает строку в 10 символов, но хотелось бы читать строку произвольной длинны. gets(buffer, strlen(buffer)); не работает. Как сделать что бы можно было читать строку произвольной длинны?
2) Как сделать что бы прога продолжала выполняться если строка не вводится? Можно смотреть rx_buffer текущий и на цикл меньше, сравнить их найти (или не найти) разницу, определить длину этой разницы и прочитать с помощью gets, но думаю можно проще. К сожалению не допру как…
3) При выводе строки в UART (смотрю спомощью Com Port Toolkit) переход на новую строку не распознается т.е. по команде printf("\nUSART %u\n",1); выводится .USART 1. (при выводе на LCD все нормально). Как указать при выводе в UART переход на новую строку?
4) При выводе на LCD значения double num=1345.2356; по коду printf("\nfloat=%.4f4", num); выводится float=4f4, а не float=1345.2356. Где ошибка?
Присоединенный проект немного подправленный код (по примеру 2UARTLCD) скомпилированный в CVAVR 1.25.5.
Подобные темы были но не совсем те…
Прикрепленные файлы
Прикрепленный файл  Proekt_v_CVAVR.rar ( 73.97 килобайт ) Кол-во скачиваний: 41
 
Go to the top of the page
 
+Quote Post
vet
сообщение May 7 2008, 04:00
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



1. sizeof, а не strlen.
2. if (буфер_приема_не_пуст()) {str[i++] = getchar(); /*...*/}
3. Правильно: \r\n. Или предусмотреть в putchar() автоматический вывод \r перед \n. Или смотреть вывод другой утилитой (Bray's Terminal, скажем).
4. %4.4f.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
defunct
сообщение May 7 2008, 08:24
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



1, 2) читать по 1-му символу
Go to the top of the page
 
+Quote Post
mr_ia
сообщение May 7 2008, 23:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Сделал так.
Работает нормально. Задержку б еще убрать… Но это не критично.

if (rx_counter1!=0)
{
delay_ms(100);
gets(UART_reciver_buffer,rx_counter1);
printf("%s\r\n",UART_reciver_buffer);
}

А вот с выводом с точкой не получается…

double num=1345.2356;
……….
printf("float=%4.4f\r\n", num); Выводит float=4f
Прикрепленные файлы
Прикрепленный файл  Proekt_v_CVAVR.rar ( 72.3 килобайт ) Кол-во скачиваний: 37
 
Go to the top of the page
 
+Quote Post
vet
сообщение May 8 2008, 04:07
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



в свойствах проекта нужно указать, что он компилируется с printf, который поддерживает float и прочие навороты.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
mr_ia
сообщение May 8 2008, 20:16
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Мдя это я забыл. Спасибо все гуд.
Go to the top of the page
 
+Quote Post
mr_ia
сообщение May 11 2008, 23:21
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Доброе время суток уважаемые.
Опять вопрос, про избитое, но он меня в тупик поставил…
Использую ATMega2560 (описание платы здесь http://electronix.ru/forum/index.php?showtopic=44112&hl= ).
При использовании UART1 (преобразователь CP2102) принимаю и отправляю строку по такому коду, см.ниже, (немного переработанный код из примера 2UARTLCD). Все гуд, работает корректно. На других UARTах стоит блютуз модуль UARTDNG105 (радиоудлинитель 232ого висит на UART2), RS-232 (MAX2323 на UART3), приемопередатчики на 433МГц (RXM-433LR, TXM-433LR+ANT433-SP, по 2 штуки висят на UART2,3) все размыкается переключателями.
Проблема в том, что код корректно работающий для CP2102 (UART1), не работает на других UARTах. Точнее так. Блютуз модуль отсылает строки корректно, но при принятии строки и отсылки ее обратно, принимается 2605(как строка), независимо от того сколько байт я послал в мк 1 или 10… Причем если смотреть количество принятых байтов (rx_counter1), то счетчик адекватен (показывает что принято столько, сколько послано…).
При использовании RS-232 то же самое, отсылается нормально, счетчик адекватен, но при отсылки принятой строки получаю 2605.
При использовании 433МГц один работает на прием, другой на передачу, сигнал у приемника нормальный, мощность передатчика тоже задана. Получаю опять 2605, счетчик адекватен.
Повторюсь, вывод данных из Меги нормально проходит, прием в буфер меги тоже, видимо засада в чтении из буфера меги в строку UART_reciver_buffer.
При использовании getchar, putchar принимается <0>.
Соответственно, думаю заморочка в использовании команды gets(UART_reciver_buffer,rx_counter1);

char UART_reciver_buffer[100]; //буфер для приема с UART
………
………
poutput=USART1;
if (rx_counter1!=0) //Если счетчик принятого не пуст
{
delay_ms(100); //Ждем пока все запишется в буфер приемника gets(UART_reciver_buffer,rx_counter1); //Читаем строку, длинна определяется с помошью счетчика принятых данных.
printf("%s\r\n",UART_reciver_buffer); //Вывод принятой строки на UART
}
Но где здесь ошибка не уразумею, или я не прав?
Подскажите в каком направлении копать?
Go to the top of the page
 
+Quote Post
mr_ia
сообщение May 12 2008, 23:25
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Разобрался, при описании getchar сделал ошибку в коде смотрел буфер 1ого UARTA

Сообщение отредактировал mr_ia - May 12 2008, 23:25
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 10:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016