Интерфейс с компьютером. UART

Электроника

Что вы знаете про UART? Сейчас в промышленности этот интерфейс пользуется большой популярностью. А все потому, что он обеспечивает надежную передачу данных и имеет низкую стоимость. Давайте рассмотрим настройки модуля UART и порядок работы с ним
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Встраиваемая система
(встроенная система, англ. embedded system) — микропроцессорная система управления, контроля и мониторинга, которая работает, будучи встроенной непосредственно в устройство, которым она управляет
Микроконтроллер
(англ. Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами. По сути, это однокристальный компьютер, способный выполнять относительно простые задачи. Отличается от микропроцессора интегрированными в микросхему устройствами ввода-вывода, таймерами и другими периферийными устройствами
Интегрированная среда разработки
(англ. IDE, Integrated development environment) — система программных средств, используемая программистами для разработки программного обеспечения. Обычно среда разработки включает в себя текстовый редактор, компилятор и/или интерпретатор, средства автоматизации сборки и отладчик. Иногда также содержит средства для интеграции с системами управления, версиями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя
Интерфейс пользователя, он же пользовательский интерфейс
(UI — англ. user interface) — интерфейс, обеспечивающий передачу информации между пользователем-человеком и программно-аппаратными компонентами компьютерной системы (ISO/IEC/IEEE 24 765−2010)
Видеолекция
Конспект
Давайте рассмотрим настройки модуля UART и порядок работы с ним. Сейчас в промышленности этот интерфейс является самым распространенным. Он обеспечивает надежную передачу данных и низкую стоимость

Подключение UART
Необходимо:

  1. Использовать преобразователь, например, USB UART
  2. Установить соответствующий драйвер, например, виртуальный COM-порт
Важно
При подключении нашего программатора в операционной системе автоматически появится драйвер
Задача
  1. С помощью специального ПО по UART передать специальную команду с параметрами на микроконтроллер
  2. Микроконтроллер должен распознать параметры и в виде ответного эха передать это сообщение
Формат команды
“имякоманды?р1=число;р2=число;.../”
  • имя команды латинскими буквами
  • р1 и р2 — имена параметров
  • правый слэш — символ окончания команды
Например, команда «comm1?р1=23;р2=44;/» должна вернуть в терминал текст «param1=23;param2=44;\r\n»
Важно
Если команда не находится в посланном наборе символов, то микроконтроллер возвращает «error: command not found\r\n», а если при определении параметра возникла ошибка, то микроконтроллер возвращает «error: not recognized\r\n»
Алгоритм
  1. Инициализация UART средствами HAL
  2. Определение входных и выходных буферов для UART
  3. Реализация нашего алгоритма в цикле
while(1)
{
	ждем пока не примем из UART один символ;
	записываем очередной символ из UART последовательно во входной буфер;
		if (текущий принятый символ равен признаку конца передачи команды)
			ищем во входном буфере имя нашей команды (“comm1”);
			if (нашли имя команды и место (индекс), где она находится)
			{
				разбираем символы, которые идут после имени команды, определяем    параметры р1 и р2 и их значения;
				if (распознали все параметры и получили их значения)
				{
				готовим ответную строку в компьютер;
				посылаем ответ на компьютер;
				}
				else
				//не распознали все параметры
				{
				посылаем ответ на компьютер - ошибка;
				}
				else
				//не нашли команду
{
посылаем ответ на компьютер - ошибка;
				}
			сброс приема во входной буфер после обнаружения признака конца команды;
			стираем входной буфер от старых значений;
			устанавливаем, что начнем писать принятые символы с начала входного буфера;
                                   }
 }
Компьютерная реализация
Чтобы реализовать проект на компьютере, мы берем прошлый проект с кнопками и светодиодами, копируем и переименовываем в UART, чтобы не писать код заново.

1. Открываем проект

2. Открываем файл с конфигурацией микроконтроллера

3. В разделе connectivity находим USART2
4. Устанавливаем асинхронный режим. Он будет подключаться к UART USB

5. Контролируем все параметры
6. Сохраняем и генерируем код
Работа с кодом
1. Переходим в файл main.c

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;", &param1, &param2); //пытаемся разобрать команду с параметрами
					 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 // формате имякоманды?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 портов
3. В поле набираем команду
4. Выполняем и смотрим эхо, которое возвращает микроконтроллер
5. Очищаем буфер
Важно
Можно для примера послать несуществующую команду или команду с неверным параметром и посмотреть на вывод ошибки.
По окончании работы не забудьте отключить программатор от компьютера
Итак, вы уже можете настраивать модуль UART и писать программу для получения и отправки данных. Давайте проверим, сможете ли вы написать ПО самостоятельно.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем!
Что означает в команде правый слэш?
Дальше
Проверить
Узнать результат
Что возвращает команда «comm1?р1=23;р2=44;/» ?
Дальше
Проверить
Узнать результат
Что возвращает микроконтроллер, если при определении параметра возникла ошибка:
Дальше
Проверить
Узнать результат
Для чего в разделе USER CODE BEGIN IncLudes мы подключаем заголовочные файлы #include «stdio.h"
Дальше
Проверить
Узнать результат
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз