Считывание данных с USB со скоростью 31250 бод - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть плата Arduino, и я хочу прочитать данные, которые она выделяет, используя USB со скоростью бод . Взяв код Arduino, я получаю следующий код C:

int serialport_init(const char* serialport, int baud)
{
    struct termios toptions;
    int fd;

    printf("init_serialport: opening port %s @ %d bps\n", serialport,baud);

    fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
    serialPortPointer = fd;

    if (fd == -1)
    {
        printf("Unable to open port when initialising hardware'n");
        return -1;
    }

    if (tcgetattr(fd, &toptions) < 0)
    {
        printf("Couldn't get term attributes when initialising hardware\n");
        return -1;
    }
    speed_t brate = baud; // let you override switch below if needed
    switch(baud) {
        case 4800:   brate=B4800;   break;
        case 9600:   brate=B9600;   break;
        case 14400:  brate=B14400;  break;
        case 19200:  brate=B19200;  break;
        case 28800:  brate=B28800;  break;
        case 38400:  brate=B38400;  break;
        case 57600:  brate=B57600;  break;
        case 115200: brate=B115200; break;
    }
    cfsetispeed(&toptions, EXTA);
    cfsetospeed(&toptions, EXTA);

    // 8N1
    toptions.c_cflag &= ~PARENB;
    toptions.c_cflag &= ~CSTOPB;
    toptions.c_cflag &= ~CSIZE;
    toptions.c_cflag |= CS8;
    // no flow control
    toptions.c_cflag &= ~CRTSCTS;

    toptions.c_cflag |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines
    toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl

    toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
    toptions.c_oflag &= ~OPOST; // make raw

    // see: http://unixwiz.net/techtips/termios-vmin-vtime.html
    toptions.c_cc[VMIN]  = 0;
    toptions.c_cc[VTIME] = 20;

    if(tcsetattr(fd, TCSANOW, &toptions) < 0)
    {
        printf("Couldn't set term attributes when initialising hardware\n");
        return -1;
    }

    return fd;
}

Проблема в том, что файл termios.h не поддерживает скорость передачи 31250 (MIDI) ... Если я пытаюсь ввести 31250 в качестве скорости передачи, эта функция возвращает -1 и говорит: «Не удалось установить атрибуты термина, когда Инициализирующее оборудование "(в самом конце происходит сбой).

Итак - как мне написать программу на C или на любом другом языке, которая считывает данные со скоростью передачи данных, которую я хочу? Поддерживает ли termios.h пользовательские скорости передачи данных?

Я буквально просто хочу прочитать данные с последовательного порта - ничего больше.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Это - библиотека, которая обеспечивает связь MIDI I / O через последовательные порты Arduino.Вам нужен Arduino, поддерживающий минимум 2 последовательных порта (например, , этот ).Один последовательный порт будет использоваться для связи с MIDI-устройствами (31250 бит / с), а другой - с ПК (например, 115200 бит / с).Если у вас есть только один последовательный порт на вашей плате Arduino, вы также можете поэкспериментировать с такой последовательной библиотекой программного обеспечения, как this .

0 голосов
/ 20 сентября 2011

API termios.h просто не имеет возможности выражать пользовательские скорости передачи, хотя в зависимости от вашей операционной системы может быть расширение для этого. Можете ли вы попробовать настроить Arduino на использование более стандартного 38400 вместо этого?

...