Указание нестандартной скорости передачи для виртуального последовательного порта FTDI в Linux - PullRequest
3 голосов
/ 07 июля 2010

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 июля 2010

Вы не можете изменить базу данных, я думаю, это связано с аппаратным обеспечением.Так что возиться с модулем вам не поможет.В третьем пункте вы говорите только о первом методе, предложенном для установки пользовательской скорости передачи данных, когда вам необходим доступ к tty->alt_speed.Кажется, что нет интерфейса для прямой установки структуры tty из пространства пользователя, по крайней мере, с драйвером 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

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

3 голосов
/ 24 марта 2011

Решение Shodanex работает с NDI Polaris Spectra (скорость передачи 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); 
}
...