- •Лабораторная 4: usart
- •Часть 1: usart. Краткое описание usart.
- •Контроль чётности
- •Управление потоком
- •Область применения.
- •Часть 2: Программирование usart. Настройка usart с помощью библиотеки StdPeriph.
- •Включение тактирования usart
- •Инициализация usart.
- •Отправка байта по usart
- •Отправка строки с текстом по usart
- •Использование функции sprintf
- •Часть 3: Протокол передачи. Протоколы передачи данных.
- •Приём данных
- •Буферы приёма
- •Примеры протоколов
- •Задание
- •Порядок выполнения задания.
Отправка байта по usart
Перед отправкой байта необходимо дождаться завершения отправки предыдущего байта с помощью строки:
while (!USART_GetFlagStatus(USART1, USART_SR_TXE)) {}
Т.о. функцию отправки одного байта данных можно написать следующим образом: //------------------------------------------------------------------------------------- //Функция, отправляющая байт в USART
//------------------------------------------------------------------------------------- void send_to_USART(uint8_t data)
{
while(!(USART2->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR
//станет равен 1
USART2->DR=data; //Отсылаем байт через USART
}
Параметр функции data является байтом, отсылаемым через USART. Например, отправить через USART байт, в котором записано число 48, можно при помощи следующей строки:
send_to_USART(48);
Отправка строки с текстом по usart
Для передачи строки данных можно использовать процедуру:
void SendString_to_ USART (const char *str)
{
while(*str != '\0')
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, *str++);
}
}
Использование функции sprintf
Функция sprintf включает в себя следующие параметры:
char *str – указатель на начало массива.
Str – строку, которую надо записать в массив.
Например, если надо записать в массив text слово Привет, надо использовать строку:
sprintf(text, “Привет”);
Если надо вывести число в массив, то это делается в зависимости от типа числа. Если число знаковое то используется директива %d. Например:
sprintf(text, “%d”, Rand); Тогда в text запишется значение переменной Rand.
Если же число беззнаковое, то используется %u. Например:
sprintf(text, “%u”, Rand); Тогда в text запишется значение переменной Rand но без знака.
Если надо ввести несколько данных в одну строку, то можно сделать так:
sprintf(text, “%u %u”, Rand[0], Rand[1]);
Часть 3: Протокол передачи. Протоколы передачи данных.
Для общения между различными устройствами обычно используется стандартный формат передачи данных. Такой формат называется протоколом.
Данные обычно разбиваются на пакеты, отдельные самодостаточные наборы данных. Протокол определяет содержимое этого пакета, его интерпретацию, местоположение различных данных в пакете и т.д.
В этом методическом пособии будут рассматриваться только протоколы, описывающие непосредственное взаимодействие двух устройств. Пользователь может самостоятельно разработать протокол, который наиболее подходит под его задачи. Но существует ряд общих черт протоколов, знание которых позволяет организовывать более эффективное общение между двумя устройствами.
Пакет данных может включать в себя следующие поля: стартовая последовательность, команда, длина данных, данные, CRC. Разумеется, ими список полей не ограничивается. Поля могу занимать любое заранее оговорённое количество байт. Рассмотрим упомянутые поля подробнее.
Стартовая последовательность говорит о начале передачи. Зачастую её делают уникальной, т.е. такой, что она больше не может встречаться в пакете. Встретив её, устройство точно знает, что это начало пакета и начинает приём.
Команда говорит устройству, что ему надо делать. Это может быть команда на запрос или пересылку данных, чтение настроек и т.д. В протоколе чётко определяется список команд, которые могут быть выполнены устройством.
Зачастую в пакете передаётся не фиксированное число данных. Для того, чтобы устройство знало сколько именно данных ему передают, существует поле длина данных.
Данные содержат в себе информацию, передаваемую устройству. Это может быть всё, что угодно, кроме команды этому устройству.
CRC – это контрольная сумма. Обычно она считается последовательным сложением байт, входящих в пакет по модулю 256. При окончании приёма, устройство повторяет процедуру и, если значения совпали, значит, данные приняты правильно.
Кроме перечисленных полей, в пакете могут присутствовать другие, связанные с особенностями построения сети. Например, при количестве устройств в сети больше 2-х, зачастую вводятся поля адресов, идентифицирующих как устройство передающее данные, так и устройство, которому эти данные предназначены.
