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

 
 
> Опять 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
 
Start new topic
Ответов
mr_ia
сообщение May 11 2008, 23:21
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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



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

 


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


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