сайт для палких паяльників

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

Настройка и проверка UART

Для того, чтобы использовать выводы UART, сначала нужно отключить их применение по умолчанию. Для этого нужно отредактировать файлы: /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]\n\n", argv[0]);
        return -1;
    }

    printf("Opening %s\n", 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\n", str);

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

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

    buffer[rcount] = '\0';

    printf("Received: %s\n", 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 чаще используют для связи с другими приборами, поэтому не забудьте вернуть все как было.

Успехов!

Смотри также:
Translate
Архіви

© 2011-2018 Андрій Корягін, Кременчук - Київ, Україна