Меню Закрыть

PL2303HX Преобразователь USB-UART

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.

1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *