Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Опять UART и строки
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
mr_ia
Доброе время суток уважаемые.
Подскажите по применению нескольких функций, желательно на присоединенном примере.
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.
Подобные темы были но не совсем те…
vet
1. sizeof, а не strlen.
2. if (буфер_приема_не_пуст()) {str[i++] = getchar(); /*...*/}
3. Правильно: \r\n. Или предусмотреть в putchar() автоматический вывод \r перед \n. Или смотреть вывод другой утилитой (Bray's Terminal, скажем).
4. %4.4f.
defunct
1, 2) читать по 1-му символу
mr_ia
Сделал так.
Работает нормально. Задержку б еще убрать… Но это не критично.

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
vet
в свойствах проекта нужно указать, что он компилируется с printf, который поддерживает float и прочие навороты.
mr_ia
Мдя это я забыл. Спасибо все гуд.
mr_ia
Доброе время суток уважаемые.
Опять вопрос, про избитое, но он меня в тупик поставил…
Использую 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
}
Но где здесь ошибка не уразумею, или я не прав?
Подскажите в каком направлении копать?
mr_ia
Разобрался, при описании getchar сделал ошибку в коде смотрел буфер 1ого UARTA
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.