Интерфейс с компьютером. UART
Электроника
“
Что вы знаете про UART? Сейчас в промышленности этот интерфейс пользуется большой популярностью. А все потому, что он обеспечивает надежную передачу данных и имеет низкую стоимость. Давайте рассмотрим настройки модуля UART и порядок работы с ним
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Встраиваемая система
(встроенная система, англ. embedded system) — микропроцессорная система управления, контроля и мониторинга, которая работает, будучи встроенной непосредственно в устройство, которым она управляет
Микроконтроллер
(англ. Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами. По сути, это однокристальный компьютер, способный выполнять относительно простые задачи. Отличается от микропроцессора интегрированными в микросхему устройствами ввода-вывода, таймерами и другими периферийными устройствами
Интегрированная среда разработки
(англ. IDE, Integrated development environment) — система программных средств, используемая программистами для разработки программного обеспечения. Обычно среда разработки включает в себя текстовый редактор, компилятор и/или интерпретатор, средства автоматизации сборки и отладчик. Иногда также содержит средства для интеграции с системами управления, версиями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя
Интерфейс пользователя, он же пользовательский интерфейс
(UI — англ. user interface) — интерфейс, обеспечивающий передачу информации между пользователем-человеком и программно-аппаратными компонентами компьютерной системы (ISO/IEC/IEEE 24 765−2010)
Видеолекция
Конспект
Давайте рассмотрим настройки модуля UART и порядок работы с ним. Сейчас в промышленности этот интерфейс является самым распространенным. Он обеспечивает надежную передачу данных и низкую стоимость
Подключение UART
Необходимо:
- Использовать преобразователь, например, USB UART
- Установить соответствующий драйвер, например, виртуальный COM-порт
Важно
При подключении нашего программатора в операционной системе автоматически появится драйвер
Задача
- С помощью специального ПО по UART передать специальную команду с параметрами на микроконтроллер
- Микроконтроллер должен распознать параметры и в виде ответного эха передать это сообщение
Формат команды
“имякоманды?р1=число;р2=число;.../”
- имя команды латинскими буквами
- р1 и р2 — имена параметров
- правый слэш — символ окончания команды
Важно
Если команда не находится в посланном наборе символов, то микроконтроллер возвращает «error: command not found\r\n», а если при определении параметра возникла ошибка, то микроконтроллер возвращает «error: not recognized\r\n»
Алгоритм
- Инициализация UART средствами HAL
- Определение входных и выходных буферов для UART
- Реализация нашего алгоритма в цикле
while(1)
{
ждем пока не примем из UART один символ;
записываем очередной символ из UART последовательно во входной буфер;
if (текущий принятый символ равен признаку конца передачи команды)
ищем во входном буфере имя нашей команды (“comm1”);
if (нашли имя команды и место (индекс), где она находится)
{
разбираем символы, которые идут после имени команды, определяем параметры р1 и р2 и их значения;
if (распознали все параметры и получили их значения)
{
готовим ответную строку в компьютер;
посылаем ответ на компьютер;
}
else
//не распознали все параметры
{
посылаем ответ на компьютер - ошибка;
}
else
//не нашли команду
{
посылаем ответ на компьютер - ошибка;
}
сброс приема во входной буфер после обнаружения признака конца команды;
стираем входной буфер от старых значений;
устанавливаем, что начнем писать принятые символы с начала входного буфера;
}
}
Компьютерная реализация
Чтобы реализовать проект на компьютере, мы берем прошлый проект с кнопками и светодиодами, копируем и переименовываем в UART, чтобы не писать код заново.
1. Открываем проект
2. Открываем файл с конфигурацией микроконтроллера
3. В разделе connectivity находим USART2
1. Открываем проект
2. Открываем файл с конфигурацией микроконтроллера
3. В разделе connectivity находим USART2
4. Устанавливаем асинхронный режим. Он будет подключаться к UART USB
5. Контролируем все параметры
5. Контролируем все параметры
6. Сохраняем и генерируем код
Работа с кодом
1. Переходим в файл main.c
2. Смотрим, что подключены функции, инициализирующие USART2
3. В разделе USER CODE BEGIN IncLudes подключаем заголовочные файлы:
4. До главного цикла программы записываем инициализацию входных буферов и переменных
2. Смотрим, что подключены функции, инициализирующие USART2
3. В разделе USER CODE BEGIN IncLudes подключаем заголовочные файлы:
- для работы со строками #include «string.h»
- для вывода и преобразования входной строки в значение #include «stdio.h»
4. До главного цикла программы записываем инициализацию входных буферов и переменных
uint8_t pData[10]; //буфер для приема данных модулем UART
uint16_t Size=1; //размер принимаемых данных за один вызов функции UART
uint16_t Size_out=0;//размер отправляемых данных за один вызов функции UART
//максимальный размер входного буфера
#define SIZE_INPUT 100
char str_in[SIZE_INPUT]; //входной буфер
char str_out[100]; //выходной буфер
uint8_t idx=0; //индекс текущей позиции символа во входном буфере
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
5. Заполняем главный цикл программы
while (1)
{
if ( HAL_UART_Receive(&huart2, pData, Size, 10) == HAL_OK) // ждем пока не примем из UART Size-количество символов (один) блокирующий режим !!!!!
{// приняли байт
str_in[idx++]=pData[0]; //копируем вновь принятый символ в новое место входного буфера
if(idx==SIZE_INPUT-1) //если превысили размер входного буфера - то начнем с его начала
idx=0;
if(pData[0]=='/')
{ //найден признак конца передачи команды
str_in[idx]=0; //терминируем строку после признака конца передачи команды - для функций поиска
char *str_comm1; //указатель на начало команды
if( (str_comm1=strstr(str_in, "comm1")) != NULL) //ищем символы команды во входном буфере
{//команда "comm1" найдена и нашли ее начало
//разбор параметров команды
int param1, param2; //где будут хранится параметры команды
int res = sscanf(str_comm1,"comm1?p1=%d;p2=%d;", ¶m1, ¶m2); //пытаемся разобрать команду с параметрами
// формате имякоманды?parameter=значение;parameter=значение;.
if(res ==2)
{// распознали все параметры
//готовим ответную строку в компьютер
sprintf(str_out, "param1=%d; param2=%d;\r\n", param1, param2);
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
else
{ //не распознали все параметры команды - ошибка
sprintf(str_out, "error: not recognized\r\n"); //строка ответа - ошибка
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
}
else
{ //не нашли команду во входном буфере - ошибка
sprintf(str_out, "error: command not found\r\n"); //строка ответа - ошибка
Size_out = strlen(str_out); //размер ответной строки
HAL_UART_Transmit(&huart2, str_out, Size_out, 10); //посылаем ответ в компьютер
}
HAL_UART_AbortReceive(&huart2);//сброс приема во входной буфер после обнаружения признака конца команды
memset(str_in, 0, SIZE_INPUT); //стираем входной буфер от старых значений - для правильности поиска
idx=0; //начнем писать символы с начала входного буфера
}
Важно
Если навести на функцию, то вы увидите ее описание
6. Сохраняем, компилируем
Тестирование
1. Запускаем терминал
2. Проводим rescan портов
2. Проводим rescan портов
3. В поле набираем команду
4. Выполняем и смотрим эхо, которое возвращает микроконтроллер
5. Очищаем буфер
Важно
Можно для примера послать несуществующую команду или команду с неверным параметром и посмотреть на вывод ошибки.
По окончании работы не забудьте отключить программатор от компьютера
По окончании работы не забудьте отключить программатор от компьютера
“
Итак, вы уже можете настраивать модуль UART и писать программу для получения и отправки данных. Давайте проверим, сможете ли вы написать ПО самостоятельно.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем! |
Что означает в команде правый слэш?
Дальше |
Проверить |
Узнать результат |
Что возвращает команда «comm1?р1=23;р2=44;/» ?
Дальше |
Проверить |
Узнать результат |
Что возвращает микроконтроллер, если при определении параметра возникла ошибка:
Дальше |
Проверить |
Узнать результат |
Для чего в разделе USER CODE BEGIN IncLudes мы подключаем заголовочные файлы #include «stdio.h"
Дальше |
Проверить |
Узнать результат |
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз |