我有一个USB设备,我正在尝试通过FTDI_SIO内核模块提供的虚拟串行端口进行通信。但是,我将端口的波特率设置为14400时遇到了一些麻烦:

  • termios.h 没有指定14400的常数,所以我无法使用 cfsetispeedcfsetospeed.
  • 在FTDI_SIO内核模块的来源中,Baud基数设置为24000000,并且似乎没有一种更改它的方法。这意味着我不能使用自定义除数 TIOCSSERIAL IOCTL并以此方式获得14400的波特率。
  • 模块源有评论,听起来像是设置 alt_speed 成员 tty_struct 端口到14400的结构将做我想要的,但是考虑到现有接口,似乎没有任何方法将其设置为14400。

有人对此有任何想法吗?通过黑客攻击内核模块可以很容易地解决此问题,但是我真的在寻找不需要内核更改的解决方案。

有帮助吗?

解决方案

您无法更改Baud基础,我想这与硬件有关。因此,与模块混乱不会对您有任何好处。在您的第三点中,您只谈论提出的第一种设置自定义波特rate的方法,您需要在其中访问 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

你尝试过吗?

其他提示

Shodanex的溶液可与Linux下的NDI Polaris光谱(Baud 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); 
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top