Как установить пользовательскую скорость передачи данных в Linux?

Я хочу подключиться через мой последовательный порт в Linux к устройству с нестандартной скоростью передачи данных, которая не определена в termios.h,

Я попробовал метод "псевдоним скорости передачи данных" из этого поста, но когда я выполняю свою C-программу (я назвал ее "testprogram"), Linux говорит "testprogram sets custom speed on ttyS0. This is deprecated."

Я провел поиск в Google, и кажется, что есть другой (более новый?) Метод для изменения скорости передачи данных в нестандартное значение: на http://sourceware.org/ml/libc-help/2009-06/msg00016.html автор говорит, что c_flag из struct termios должно быть OR'd с BOTHER (=CBAUDEX | B0), С помощью этого метода скорость передачи устанавливается прямо в c_ispeed а также c_ospeed-члены struct termios, Тем не менее, я не знаю, как я использую этот метод в моей C-программе. Как сказал автор, нет BOTHER определено / доступно, когда я включаю termios.hИтак, что нужно сделать, чтобы установить скорость передачи данных таким образом?

Как я могу установить скорость передачи данных в нестандартное значение без изменения ядра?

6 ответов

Я заметил то же самое о том, что ОБА не определена. Как сказал Джейми Шарп, вы можете найти его в <asm/termios.h>, Просто предупреждение, я думаю, что я столкнулся с проблемами, включая и это, и обычные <termios.h> файл в то же время.

Кроме того, я обнаружил, что с имеющимся у меня glibc он все еще не работает, потому что tcsetattr из glibc делал ioctl для старой версии struct termios, которая не обращает внимания на настройку скорости. Я смог установить пользовательскую скорость, выполнив ioctl вручную с новой структурой termios2 стиля, которая также должна быть доступна, включив <asm/termios.h>:

struct termios2 tio;

ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);

Вы можете установить пользовательскую скорость передачи данных, используя stty Команда в Linux. Например, чтобы установить настраиваемую скорость передачи 567890 для вашего последовательного порта /dev/ttyX0, используйте команду:

stty -F /dev/ttyX0 567890

У dougg3 это довольно много (я не могу комментировать там). Главное, что вам нужно знать, это заголовки, которые не конфликтуют друг с другом, но предоставляют правильные прототипы. Ответ

#include <stropts.h>
#include <asm/termios.h>

После этого вы можете использовать код dougg3, желательно с проверкой ошибок вокруг вызовов ioctl(). Возможно, вам потребуется поместить это в отдельный файл.c к остальной части кода последовательного порта, который использует обычные термины для установки других параметров. Сначала выполняйте манипуляции с POSIX, а затем настраивайте пользовательскую скорость. Он отлично работает на встроенном UART Raspberry Pi, чтобы получить скорость передачи 250 кбод.

Для пользователей Mac (возможно, также для некоторых дистрибутивов Linux)

stty ospeed 999999

stty ispeed 999999

BOTHER кажется доступным из <asm/termios.h> в линуксе Получение этого определения будет непереносимым, но я предполагаю, что этот API в любом случае непереносим, ​​так что, вероятно, это не большая потеря.

Вы можете просто использовать обычный заголовок termios и обычную структуру termios (это то же самое, что и termios2 при использовании заголовка asm/termios).

Итак, вы открываете устройство с помощью open() и получаете дескриптор файла, а затем используете его в tcgetattr() чтобы заполнить вашу структуру termios.

Тогда ясно CBAUD и установить CBAUDEX на c_cflag.CBAUDEX имеет то же значение, что и BOTHER.

После установки вы можете установить индивидуальную скорость передачи данных, используя обычные функции, например cfsetspeed(), указав желаемую скорость передачи в виде целого числа.

На процессоре вашей материнской платы есть микросхема последовательного ввода-вывода ( 16650 UART). Эта микросхема использует 8-битный порт в качестве шины управления и данных, и, таким образом, вы можете подать ей команду путем записи в этот чип через шину управления и данных.

Обычно приложение выполняет следующие действия на последовательном порту

  1. Установите скорость передачи, четность, кодирование, управление потоком и начальную / конечную длину последовательности во время запуска программы. Эта настройка может быть выполнена через ioctl к последовательному устройству или командой 'stty'. Фактически, команда stty использует ioctl для этого последовательного устройства.
  2. Записывайте символы данных на последовательное устройство, и драйвер будет записывать символы данных на микросхему UART через его 8-битную шину данных.

Короче говоря, вы можете указать скорость передачи только в команде STTY, и тогда все остальные параметры будут сохранены по умолчанию, и этого должно быть достаточно для подключения к другим устройствам.

Другие вопросы по тегам