Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
3 / 3 / 2
Регистрация: 04.01.2013
Сообщений: 73

UART baud rate в терминале

28.06.2016, 02:11. Показов 2894. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть проект. Atmega2560 считывает данные с сенсора bno055 и отправляет их по UART на терминал. Для UART-а использую библиотеку Петера Флюри. В ней baud rate подсчитывается вот по такой формуле
UART_BAUD_SELECT

C
1
2
3
4
5
/** @brief  UART Baudrate Expression
 *  @param  xtalcpu  system clock in Mhz, e.g. 4000000UL for 4Mhz          
 *  @param  baudrate baudrate in bps, e.g. 1200, 2400, 9600     
 */
#define UART_BAUD_SELECT(baudRate,xtalCpu)  (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)


И потом рассчитанное значение используется для инициализации UART-а, вот тут.

void uart_init(unsigned int baudrate)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*************************************************************************
Function: uart_init()
Purpose:  initialize UART and set baudrate
Input:    baudrate using macro UART_BAUD_SELECT()
Returns:  none
**************************************************************************/
void uart_init(unsigned int baudrate)
{
    UART_TxHead = 0;
    UART_TxTail = 0;
    UART_RxHead = 0;
    UART_RxTail = 0;
    
#if defined( AT90_UART )
    /* set baud rate */
    UBRR = (unsigned char)baudrate; 
 
    /* enable UART receiver and transmmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
 
#elif defined (ATMEGA_USART)
    /* Set baud rate */
    if ( baudrate & 0x8000 )
    {
         UART0_STATUS = (1<<U2X);  //Enable 2x speed 
         baudrate &= ~0x8000;
    }
    UBRRH = (unsigned char)(baudrate>>8);
    UBRRL = (unsigned char) baudrate;
   
    /* Enable USART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    #ifdef URSEL
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    #else
    UCSRC = (3<<UCSZ0);
    #endif 
    
#elif defined (ATMEGA_USART0 )
    /* Set baud rate */
    if ( baudrate & 0x8000 ) 
    {
        UART0_STATUS = (1<<U2X0);  //Enable 2x speed 
        baudrate &= ~0x8000;
    }
    UBRR0H = (unsigned char)(baudrate>>8);
    UBRR0L = (unsigned char) baudrate;
 
    /* Enable USART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    #ifdef URSEL0
    UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
    #else
    UCSR0C = (3<<UCSZ00);
    #endif 
 
#elif defined ( ATMEGA_UART )
    /* set baud rate */
    if ( baudrate & 0x8000 ) 
    {
        UART0_STATUS = (1<<U2X);  //Enable 2x speed 
        baudrate &= ~0x8000;
    }
    UBRRHI = (unsigned char)(baudrate>>8);
    UBRR   = (unsigned char) baudrate;
 
    /* Enable UART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
 
#elif defined ( AT90USB_USART )
   /* set baud rate */
    if ( baudrate & 0x8000 ) 
    {
        UART0_STATUS = (1<<U2X1 );  //Enable 2x speed 
        baudrate &= ~0x8000;
    }
    UBRR1H = (unsigned char)(baudrate>>8);
    UBRR1L = (unsigned char) baudrate;
 
    /* Enable UART receiver and transmitter and receive complete interrupt */
    UART0_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);
#endif
 
}/* uart_init */

У меня F_CPU = 20MGHz, а baudRate я подбирал методом тыка. Методом тыка, потому что, если я в терминале (например в Putty) выставляю ту же baudRate, которую я подставлял в формулу, то терминал выдаёт принятые данные в виде абракадабры. Поэтому при F_CPU = 20MGHz и при подставленной в формулу baudRate = 38400 в терминале нужно выбрать (тоже получено методом тыка) Baud Rate = 14400. Теперь мне нужно, чтобы в терминале была выставлена Baud Rate = 115200. А в коде нужно тогда подбирать, но я не пойму как.

Вот рабочие значения, которые я уже использовал:

F_CPU 16000000UL UART_BAUD_RATE 9600 Terminal_BAUD_RATE 4800
F_CPU 20000000UL UART_BAUD_RATE 38400 Terminal_BAUD_RATE 14400

А нужно теперь

F_CPU 20000000UL UART_BAUD_RATE ?????? Terminal_BAUD_RATE 115200

Сама же формула вычисляет какие-то непонятные значения.
Например при тех же F_CPU 20000000UL UART_BAUD_RATE 38400, её результат 32,052083, что естественно никак не соответствует тем 14400, которые приходится выставлять в терминале, чтобы отображал данные корректно.

Куда копать вообще? Почему разнятся значения BAUD_RATE выставленные в коде и в терминале? Подскажите пожалуйста что я не понимаю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2016, 02:11
Ответы с готовыми решениями:

Подскажите по Baud Rate (18F2550)
Пытаюсь подрихтовать чужой код. В Пиках ни бум-бум. Камень PIC18F2550. В даташите формула частоты USORT: Foss/ Вопрос. Что...

STM32 и минимальный USART Baud Rate
Здравствуйте! В утилите STM32CubeMX заметил такую вещь, что нельзя выбрать скорость UART менее 11722 кбит/с (при тактировании контроллера...

Проблема с USART baud rate и USB->COM конвертером
Добрый всем день! Я пытаюсь написать в асме код для передачи данных между Arduino Pro Mini (Atmego328p) и PC терминалом. Код пишу и...

1
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
28.06.2016, 17:44
Цитата Сообщение от St@nton Посмотреть сообщение
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)
так может сделать "финт ушами"?
C
1
#define UART_BAUD_SELECT(baudRate,xtalCpu) (38400)// подбирайте здесь бодрейт (115200)
те просто подбирайте частоту устанавливая нужную

только я не понимаю как у вас бодрейты разные?
у вас приемник и передатчик на разных скоростях?
у вас там RS-485? осциллограф подключали к линии сигнал не стертый?
волновое сопротивление линии какое? 120 Ом? Терминаторы есть?
топология шина?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2016, 17:44
Помогаю со студенческими работами здесь

Сообщения для 2 UART выводятся в 1 UART, STM32F103C8T6
Почему может неправильно работать uart? Подключил 1 uart к пк через usb/uart переходник, а второй к gsm модему. В первый уарт вывожу инфу...

Ошибка: BuildCommDCB('baud=9600 parity=N data=8 stop=1', &dcb );
Хелп! С happytown.ru скачал доку про компорт, вродебы все понятно, но не работает у меня! Выдает ошибку при выполнении...

Два TX UART на один RX. Мультиплексирование UART.
Привет, сообщество. Возник небольшой затык. Есть необходимость при одном UART на Atmego32 подавать на вход два сигнала от других...

lcd multiplex rate
Привет. Что такое multiplex rate для графического ЖК? Например 1/34 что означает?

Raw Read Error Rate 1
Всем привет. Столкнулся на днях с проблемой медленной работы жесткого диска. Смарт тест ругается на параметр Raw Read Error Rate и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru