термин ios настройки последовательного модема USB игнорируются - PullRequest
0 голосов
/ 04 мая 2020

Я на Ubuntu 18.04 и пытаюсь читать AT-команды с модема. Мне нужно внести некоторые изменения в последовательный интерфейс, чтобы правильно передать эти команды. Однако, если я попытаюсь установить скорость передачи, она останется прежней. Я использую следующий код:

#include <iostream>
#include <exception>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>

#define DEVICE "/dev/ttyUSB2"

using namespace std;

class ATException : public exception {
public:
    ATException(string msg) : msg(msg) { }

    virtual const char* what() const throw() {
        return msg.c_str();
    }

private:
    string msg;
};

void set_speeds(int fd, speed_t ispeed, speed_t ospeed) {
    struct termios term_args;
    int result = tcgetattr(fd, &term_args);
    if (result != 0) throw ATException ("unable to tcgetattr device");

    term_args.c_cflag = CS8 | CREAD | CLOCAL;

    if (cfsetispeed(&term_args, ispeed) != 0) throw ATException("error setting i speed");

    if (cfsetospeed(&term_args, ospeed) != 0) throw ATException("error setting o speed");

    if (tcsetattr(fd, TCSANOW, &term_args) != 0) throw ATException("unable to set device attr");
}

void get_speeds(int fd, speed_t& ispeed, speed_t& ospeed) {
    struct termios term_args;
    memset(&term_args, 0, sizeof term_args);
    int result = tcgetattr(fd, &term_args);
    if (result != 0) throw ATException ("unable to tcgetattr device");

    ispeed = cfgetispeed(&term_args);
    ospeed = cfgetospeed(&term_args);
}

int main (int argc, char** argv) {
    speed_t ispeed;
    speed_t ospeed;
    struct termios term_args;

    int device_fd = open(DEVICE, O_RDWR);
    if (device_fd == -1) {
        cerr << "unable to open device " << DEVICE << endl;
        exit(1);
    }

    try {
        cout << "  B9600 speed: " <<   B9600 << endl;
        cout << " B38400 speed: " <<  B38400 << endl;
        cout << "B115200 speed: " << B115200 << endl;
        cout << "B230400 speed: " << B230400 << endl << endl;

        get_speeds(device_fd, ispeed, ospeed);
        cout << "current i speed: " << ispeed << endl;
        cout << "current o speed: " << ospeed << endl;

        speed_t test_speeds [] = {B38400, B115200, B230400};
        for (int i = 0; i < (sizeof(test_speeds) / sizeof(speed_t)); i++) { 
            cout << "setting speeds to " << test_speeds[i] << endl;
            set_speeds(device_fd, test_speeds[i], test_speeds[i]);
            get_speeds(device_fd, ispeed, ospeed);
            cout << "current i speed: " << ispeed << endl;
            cout << "current o speed: " << ospeed << endl;
        }

        int chars_written;
        // writing/reading
        chars_written = write(device_fd, "AT\r", 3);
        cout << "written " << chars_written << " chars" << endl;

        char read_buf [16];
        int chars_read = read(device_fd, read_buf, sizeof(read_buf));
        cout << "read (" << chars_read << "): " << read_buf << endl;
        usleep(50000);
        chars_read = read(device_fd, read_buf, sizeof(read_buf));
        cout << "read (" << chars_read << "): " << read_buf << endl;

    } catch (ATException& e) {
        cerr << "ERROR: " << e.what() << DEVICE << endl;
    }

    close(device_fd);
}

Если я выполню это, я получу следующий вывод:

  B9600 speed: 13
 B38400 speed: 15
B115200 speed: 4098
B230400 speed: 4099

current i speed: 13
current o speed: 13
setting speeds to 15
current i speed: 13
current o speed: 13
setting speeds to 4098
current i speed: 13
current o speed: 13
setting speeds to 4099
current i speed: 13
current o speed: 13
written 3 chars
...

Кажется, что скорость передачи не изменилась. Почему это? Я что-то пропустил? Спасибо за помощь. Дайте мне знать, если есть что-то, что нужно уточнить, пожалуйста!

Если вы считаете, что мой вопрос стоит ниже, оставьте комментарий, чтобы я мог улучшить свой вопрос или учиться на будущее. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...