Указание нестандартного уровня передачи для виртуального последовательного порта FTDI под Linux

StackOverflow https://stackoverflow.com/questions/3192478

Вопрос

У меня есть USB -устройство, с которым я пытаюсь общаться через виртуальный последовательный порт, предоставленный модулем ядра FTDI_SIO. Тем не менее, у меня возникают проблемы с установлением скорости порта в 14400:

  • termios.h не указывает константу для 14400, поэтому я не могу использовать cfsetispeed и cfsetospeed.
  • В источнике для модуля ядра ftdi_sio база бод установил на 24000000, и, похоже, нет способа его изменить. Это означает, что я не могу использовать пользовательский делитель с TIOCSSERIAL Ioctl и получите 14400 -й скорость передачи 14400 таким образом.
  • У источника модуля есть комментарий, который звучит как настройка alt_speed член tty_struct Структура для порта до 14400 года сделала бы то, что я хочу, но, похоже, нет никакого способа установить его на 14400, учитывая существующие интерфейсы.

У кого -нибудь есть идеи по этому поводу? Было бы довольно легко исправить это, взломав модуль ядра, но я действительно ищу решение, которое не требует изменений ядра.

Это было полезно?

Решение

Вы не можете изменить базу в бод, я полагаю, что это связано с оборудованием. Так что возиться с модулем не принесет вам пользы. В своем третьем пункте вы говорите только о первом методе, предложенном для установки пользовательского Baudrate, где вам нужно получить доступ к tty->alt_speed. Анкет Кажется, нет интерфейса, чтобы напрямую установить TTY Struct из пользователя, по крайней мере, не с драйвером FTDI_SIO.
Тем не менее, есть еще один метод, объясненный в комментариях:

     * 3. You can also set baud rate by setting custom divisor as follows
     *    - set tty->termios->c_cflag speed to B38400
     *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
     *      follows:
     *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
     *      o custom_divisor set to baud_base / your_new_baudrate

Вы пробовали?

Другие советы

Решение Shodanex работает со спектрами NDI Polaris (Baud 1,2 Мбит / с) под Linux. Как указано, откройте последовательное устройство (/dev/ttyusb0) с B38400,

int port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
tcgetattr(port,&g_initialAtt);// save this to restore later
newAtt=g_initialAtt;
newAtt.c_cflag = B38400 | CS8 | CLOCAL | CREAD; 
cfmakeraw(&newAtt);
tcsetattr(port,TCSANOW,&newAtt);

затем выполнить:

if(ioctl(port, TIOCGSERIAL, &sstruct) < 0){
    printf("Error: could not get comm ioctl\n"); 
    exit(0); 
}
sstruct.custom_divisor = custDiv;
//sstruct.flags &= 0xffff ^ ASYNC_SPD_MASK; NO! makes read fail.
sstruct.flags |= ASYNC_SPD_CUST; 
if(ioctl(port, TIOCSSERIAL, &sstruct) < 0){
    printf("Error: could not set custom comm baud divisor\n"); 
    exit(0); 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top