PL2303HX — это популярный USB-UART преобразователь, позволяющий подключать микроконтроллеры к компьютеру через стандартный USB-порт. На борту модуля установлен чип Prolific PL2303HX, обеспечивающий преобразование сигналов USB в последовательный интерфейс UART.Такой адаптер часто используется в разработке и отладке микроконтроллерных проектов, так как позволяет легко наладить обмен данными с ПК. В нашей статье мы будем использовать PL2303HX, чтобы соединить микроконтроллер по UART с компьютером и выводить символы в терминале.Работать будем с linux.
Схема подключения
Сам модуль выглядит следующим образом
Модуль PL2303HX имеет пять основных выводов
- 3.3 V
- TXD – передача данных (выход из модуля, подключается к RX микроконтроллера);
- RXD – прием данных (вход модуля, подключается к TX микроконтроллера);
- GND – общий провод (земля)
- 5V
Т.к. наш модуль получает питание от USB то схема подключения максимально простая. Нужно соединить вывод TX микроконтроллера с RX модуля и RX микроконтроллера с TX модуля. Этого достаточно для передачи и приема данных.
Настройка UART микроконтроллера.
Работаем в CubeIDE. Настройка стандартная, асинхронный мод, скорость 115200 Bit/s, длина 8 бит, без бита паритета и с одним стоп битом.
После того как выставили настройки, генерируем наш код. Добавим пару строк. Переменную в которой будет строка, её будем передавать.
/* USER CODE BEGIN PV */ char msg[] = "Hello from microcontoller\r\n"; /* USER CODE END PV */
И саму функцию передачи.
while (1) { HAL_UART_Transmit(&huart3, (uint8_t*)msg, sizeof(msg) - 1, HAL_MAX_DELAY); HAL_Delay(1000); }
Таким образом, будем посылать нашу строку по UART один раз в секунду.
Настройка терминала.
С настройками микроконтроллера закончили, теперь настроим наш терминал для приёма данных. Для начала проверим где находится наше устройство. Напишем в терминале следующее.
dmesg | grep tty
Обычно это /dev/ttyUSB0 или /dev/ttyUSB1. В моём случае это /dev/ttyUSB0
Даем права доступа.
sudo usermod -aG dialout $USER
Для вывода данных будем использовать minicom (утилита позволяющая устанавливать связь с устройствами через последовательные порты (COM-порты)).
Сначала установим её
sudo apt install minicom
Затем запустим
minicom -b 115200 -D /dev/ttyUSB0
В результате каждую секунду будет отправляться наша строка
Для завершения работы minicom ctrl + shift + a Затем X.
Передача данных в микроконтроллер
С приёмом разобрались. Теперь давайте передадим какую-нибудь команду чтобы управлять нашим микроконтроллером. Например, я хочу написать в терминале led on и зажечь светодиод на нашей плате, затем написать led off и потушить светодиод.
Ставим вывод PD13 ( работаем с STM32F4 Discovery ) на выход. Здесь будет наш светодиод. Далее напишем функцию прерывания (не забудьте включить прерывания в вашем CubeIDE для UART).
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART3) { // проверка что это наш UART char c = rxBuf[0]; if (c == '\r' || c == '\n') { // конец строки cmdBuf[idx] = '\0'; idx = 0; if (strcmp(cmdBuf, "led on") == 0) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); // включить светодиод char msg[] = "LED ON SUCCESS\r\n"; HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); } else if (strcmp(cmdBuf, "led off") == 0) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); // выключить светодиод char msg[] = "LED OFF SUCCESS\r\n"; HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); } else { char msg[] = "Unknown command\r\n"; HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); } } else { if (idx < RX_BUF_SIZE - 1) { cmdBuf[idx++] = c; // добавляем символ в строку } } // снова включаем приём HAL_UART_Receive_IT(&huart3, rxBuf, 1); } }
Функция проверяет что прерывание произошло от нашего UART, затем добавляет к переменной то что пришло от компьютера и если совпадает с “led on” то включает светодиод, а если совпадает с “led off” то выключает. Если же пришли неизвестные данные то передаёт “Unknown command”. Затем снова включает прием. Добавим переменные для работы.
uint8_t rxBuf[1]; // приём по 1 байту char cmdBuf[RX_BUF_SIZE]; // буфер строки uint8_t idx = 0;
Запустим передачу одной строки и сразу же включим приём.
HAL_UART_Transmit(&huart3, (uint8_t*)msg, sizeof(msg) - 1, HAL_MAX_DELAY); HAL_UART_Receive_IT(&huart3, rxBuf, 1);
Откроем наш терминал minicom. Видим что сразу же пришла строка “Hello from microcontroller”. Для того чтобы мы могли что-то ввести необходимо включить режим эхо. Для этого воспользуемся комбинацией клавиш ctrl + a , затем Z. Это откроет меню. Нажимаем клавишу E. Режим включен и мы можем вводить наши команды. Попробуем ввести led on и видим что светодиод горит а в терминале сообщение об успешном выполнении команды.
Мы подключили модуль PL2303HX к микроконтроллеру по интерфейсу UART и связали его с компьютером через USB. С помощью простой программы на STM32 отправили строковые сообщения и числа, которые успешно отобразились в терминале. В обратную сторону передали команду через терминал и микроконтроллер её обработал включив светодиод. Таким образом мы проверили двусторонний обмен данными и управление периферией через UART.
Отличная статья, сделал все как написано и заработало с первого раза.