Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Кроме того, я обнаружил, что с glibc я все еще не работал, потому что glibc tcsetattr выполнял ioctl для старой версии struct termios, которая не обращает внимания на настройку скорости. Я смог установить пользовательскую скорость, вручную выполнив ioctl с новой структурой termios2 style, которая также должна быть доступна, включая <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);

Ответ 2

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

stty -F /dev/ttyX0 567890

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

stty ospeed 999999

stty ispeed 999999