Как установить пользовательскую скорость передачи в 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
, так что нужно сделать, чтобы установить скорость передачи таким образом?
Как установить скорость передачи в нестандартное значение без изменения ядра?
Ответы
Ответ 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