3

我有一个 USB 设备,我试图通过 ftdi_sio 内核模块提供的虚拟串行端口与之通信。但是,我在将端口的波特率设置为 14400 时遇到了一些问题:

  • termios.h没有为 14400 指定常量,所以我不能使用cfsetispeedand cfsetospeed
  • 在 ftdi_sio 内核模块的源代码中,波特基设置为 24000000,似乎没有办法改变它。这意味着我不能对TIOCSSERIALioctl 使用自定义除数并以这种方式获得 14400 波特率。
  • 模块源有一条评论,听起来好像将端口结构的alt_speed成员设置tty_struct为 14400 会做我想做的事,但鉴于现有接口,似乎没有任何方法可以将其设置为 14400。

有人对此有任何想法吗?通过破解内核模块很容易解决这个问题,但我真的在寻找一种不需要内核更改的解决方案。

4

2 回答 2

4

你不能改变波特基,我想它与硬件有关。所以弄乱模块对你没有任何好处。在您的第三点中,您只讨论了设置自定义波特率的第一种方法,您需要在其中访问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

你试过了吗?

于 2010-07-07T07:21:40.707 回答
3

Shodanex 的解决方案适用于 Linux 下的 NDI Polaris Spectra(波特率为 1.2mbps)。按照说明,用 B38400 打开串口设备(/dev/ttyUSB0),

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); 
}
于 2011-03-24T17:07:43.380 回答