在Linux上设置自定义波德率的方法是什么?
这个问题的答案必须是在一个级别的用户地低级别的API (ioctl,等等)。高于syscall的级别。至少在这些情况下,它应该有用:
发布于 2013-10-18 01:49:16
不幸的是,这一切都依赖于司机。好的驱动程序将实现以下所有方法。坏的驱动程序只会实现其中的一些方法。因此,你需要尝试他们所有的。下面的所有方法都是在core.c中的助手函数中实现的。
以下4种选择是可用的。
tty->termios->c_cflag中设置。您可以从以下内容中选择:
B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B57600 B19200 B38400 B19200 B38400 B19200 B19200 B38400 B4800 B9600 B19200 B38400 B9600 B19200 B38400 B38400 B19200 B38400 B57600- set `tty->termios->c_cflag` speed to `B38400`
- call `TIOCSSERIAL` ioctl with (struct serial\_struct) set as follows:系列->标志& ASYNC_SPD_MASK == ASYNC_SPD_HI、VHI、SHI、WARP //这是一种断言,即代码必须实现什么,而不是如何实现。
这设置交替速度为HI: 57600,VHI: 115200,SHI: 230400,经度: 460800。
- Set `tty->termios->c_cflag` speed to `B38400`. This is unrelated to the speed you chose!
- Set the intended speed in `tty->alt_speed`. It gets ignored when `alt_speed==0`.
- Set `tty->termios->c_cflag` speed to `B38400`. This is unrelated to the speed you chose!bool set_baudrate(int,long baudrate) { struct项;if (tcgetattr(fd,&term))返回false;term.c_cflag &= ~(CBAUD _ CBAUDEX);term.c_cflag |= B38400;if (tcsetattr(fd,TCSANOW,&term))返回false;// cont在下面
-调用TIOCSSERIAL ioctl,其struct serial_struct设置如下:
串行->标志& ASYNC_SPD_MASK == ASYNC_SPD_CUST串行->定制_除数器==串行->baud_base/ your_new_baudrate //这些都是断言,即代码必须实现什么,而不是如何实现。
该怎么做呢?首先,通过调用baud_base ioctl来填充结构(包括您需要的TIOCGSERIAL )。然后修改它以指示新的波德率,并使用TIOCSSERIAL设置它。
// cont'd struct serial\_struct serial; if (ioctl(fd, TIOCGSERIAL, &serial)) return false; serial->flags &= ~ASYNC\_SPD\_MASK; serial->flags |= ASYNC\_SPD\_CUST; serial->custom\_divisor = serial->baud\_base / baudrate. if (ioctl(fd, TIOCSSERIAL, &serial)) return false; return true; }https://stackoverflow.com/questions/19440268
复制相似问题