在Linux下指定FTDI虚拟串行端口的非标准波特率
-
02-10-2019 - |
题
我有一个USB设备,我正在尝试通过FTDI_SIO内核模块提供的虚拟串行端口进行通信。但是,我将端口的波特率设置为14400时遇到了一些麻烦:
termios.h
没有指定14400的常数,所以我无法使用cfsetispeed
和cfsetospeed
.- 在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);
}
不隶属于 StackOverflow