Raspberry Pi - UART


30.09.2014

Raspberry Pi має порт UART, RXD (GPIO15) і TXD (GPIO14). Сьогодні ми навчимося його використовувати. До UART можна підключити будь-який пристрій. Я підключив Bluetooth модуль. До нього підключився зі смартфону за допомогою термінальної програми SENA BTerm і таким чином мав зв’язок з Raspberry Pi. Можна підключити RaspberryPi до комп’ютера за допомогою UART-USB модуля і зробити термінальний зв’язок між Raspberry Pi та вашим комп’ютером.

Налаштування та перевірка UART

Для того, щоб використовувати виводи UART на Raspberry Pi, спочатку треба вимкнути їх застосування за замовчуванням. Для цього треба відредагувати файли: /boot/cmdline.txt і /etc/inittab Рекомендую спочатку виконати резервне копіювання цих файлів:


cp /boot/cmdline.txt /boot/cmdline.bak
cp /etc/inittab /etc/inittab.bak

Видаліть рядки "console=ttyAMA0,115200" та "kgdboc=ttyAMA0,115200" у файлі /boot/cmdline.txt за допомогою редактора nano:


nano /boot/cmdline.txt

Закоментуйте останнього рядка у файлі /etc/inittab. Поставте в символ # перед T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100


nano /etc/inittab

Перезавантажте систему:


reboot

Тепер RXD (GPIO15) і TXD (GPIO14) доступні для використання UART. Встановимо програму монітора minicom:


apt-get install minicom

Запустимо програму консолі:


minicom -b 9600 -o -D /dev/ttyAMA0

Консоль працює. Набрані в консолі символи мають передаватися на приєднаний пристрій, а інформація, надіслана пристроєм, має відображатися у консолі. Якщо цього не відбувається, перевірте чи правильно ви встановили швидкість з’єднання.

Використання UART у Python

Встановимо бібліотеку pyserial для використання UART у Python:


http://softlayer-ams.dl.sourceforge.net/project/pyserial/pyserial/2.7/pyserial-2.7.tar.gz
tar xvfz pyserial-2.7.tar.gz
cd pyserial-2.7
python setup.py install

Напишемо наступний скрипт на Pyton. Файл uart_test.py:


import serial
ser = serial.Serial("/dev/ttyAMA0")
ser.write("It works!")
read = ser.read()
print read
ser.close()

Запустимо його:


python ./uart_test.py

Скрипт відправляє рядок "It works!" та чекає на інформацію з іншої сторони, приймає і виводить у консоль прийнятий символ.

Використання UART на мові програмування C

uart.c:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(int argc, char* argv[]) {

    struct termios serial;
    char* str = "Hello";
    char buffer[10];

    if (argc == 1) {
        printf("Usage: %s [device]", argv[0]);
        return -1;
    }

    printf("Opening %s", argv[1]);

    int fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1) {
        perror(argv[1]);
        return -1;
    }

    if (tcgetattr(fd, &serial) < 0) {
        perror("Getting configuration");
        return -1;
    }

    // Set up Serial Configuration
    serial.c_iflag = 0;
    serial.c_oflag = 0;
    serial.c_lflag = 0;
    serial.c_cflag = 0;

    serial.c_cc[VMIN] = 0;
    serial.c_cc[VTIME] = 0;

    serial.c_cflag = B115200 | CS8 | CREAD;

    tcsetattr(fd, TCSANOW, &serial); // Apply configuration

    // Attempt to send and receive
    printf("Sending: %s", str);

    int wcount = write(fd, str, strlen(str));
    if (wcount < 0) {
        perror("Write");
        return -1;
    }
    else {
        printf("Sent %d characters", wcount);
    }

    int rcount = read(fd, buffer, sizeof(buffer));
    if (rcount < 0) {
        perror("Read");
        return -1;
    }
    else {
        printf("Received %d characters", rcount);
    }

    buffer[rcount] = `\0`;

    printf("Received: %s", buffer);

    close(fd);
}

Компілюємо


gcc -o uart -l rt uart.c

Запускаємо:


./uart /dev/ttyAMA0

У моєму випадку довелося коригувати швидкість з’єднання у рядку


serial.c_cflag = B115200 | CS8 | CREAD;

Після заміни B115200 на B9600 і повторної компіляції все запрацювало як слід.

Використання UART як термінальної консолі

UART може виступати в якості консолі для керування RaspberryPi. Зробимо щоб через UART підіймалася справжня консоль. Така, яка з’являється, коли підключаємося через SSH. З логіном та таке інше:


nano /etc/inittab

Розремлюємо рядок:


T0:23:respawn:/sbin/getty -L ttyAMA0 9600 vt100

9600 - швидкість. Правимо якщо треба. Пересмикуємо:


kill -1 1

Тепер, коли я підключаюсь зі смартфону на Bluetooth модуль, маю повноцінну консоль Rasberry Pi. Можу керувати RaspberryPi як і з SSH клієнта. Це навряд Вам знадобиться, UART частіше використовують для зв’язку з іншими приладами, тому не забудьте повернути все як було.

Успіхів.

Дивись також:

Raspberry Pi
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви