Как использовать термин ios .h для настройки последовательного порта для передачи необработанных байтов? - PullRequest
0 голосов
/ 22 января 2020

Мне нужно связаться с частью оборудования через виртуальное последовательное USB-устройство. Все, что мне нужно, это передавать необработанные байты назад и вперед со скоростью с правильными настройками UART, я никогда не хочу использовать терминал. Доказательство концептуального программного обеспечения с использованием термина ios не настраивает правильные биты и не работает, пока я не введу строку конфигурации magi c поверх stty перед запуском.

Я попытался повторить все настройки из stty, которая появляется в справочной странице POSIX для термина ios .h, и все еще не работает, и теперь имеет экран, полный кода установки стандартного флага.

Какой должна быть минимальная конфигурация с использованием термина ios .h, чтобы получить последовательный порт без терминала? И если есть какие-то дополнения для Linux, в частности, мне нужно знать их.

Ответы [ 2 ]

1 голос
/ 22 января 2020
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <termios.h>

int serial_open(char *port, int baud)
{
    int fd;
    struct termios tty;
    if((fd = open(port, O_RDWR | O_NOCTTY | O_SYNC)) < 0)
    {
        return -1;
    }

    if(tcgetattr(fd, &tty) < 0)
    {
        return -1;
    }

    cfsetospeed(&tty, (speed_t)baud);
    cfsetispeed(&tty, (speed_t)baud);
    tty.c_cflag |= (CLOCAL | CREAD);
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8;
    tty.c_cflag &= ~PARENB;
    tty.c_cflag |= CSTOPB;
    tty.c_cflag &= ~CRTSCTS;
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
    tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
    tty.c_oflag &= ~OPOST;
    tty.c_cc[VMIN] = 1;
    tty.c_cc[VTIME] = 1;
    if(tcsetattr(fd, TCSANOW, &tty))
    {
        return -1;
    }

    return fd;
}

/* example usage */
int fd = serial_open("/dev/ttyUSB0", B9600);
0 голосов
/ 27 января 2020

Вкл. Linux, по крайней мере, функция cfmakeraw() установит флаги в блоке struct termios последовательных настроек для необработанного ввода-вывода. В этом случае рабочий процесс с удаленной проверкой ошибок выглядит следующим образом:

int fd = open(portname, O_RDWR | O_NOCTTY);
struct termios portSettings;
tcgetattr(fd, &portSettings);
cfsetispeed(&portSettings, B115200);
cfsetospeed(&portSettings, B115200);
cfmakeraw(&portSettings);
tcsetattr(fd, TCSANOW, &portSettings);
...