Я на 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
...
Кажется, что скорость передачи не изменилась. Почему это? Я что-то пропустил? Спасибо за помощь. Дайте мне знать, если есть что-то, что нужно уточнить, пожалуйста!
Если вы считаете, что мой вопрос стоит ниже, оставьте комментарий, чтобы я мог улучшить свой вопрос или учиться на будущее. Спасибо.