首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux上的串口设备上设置非标准的波德率?

如何在Linux上的串口设备上设置非标准的波德率?
EN

Stack Overflow用户
提问于 2013-10-18 01:49:16
回答 1查看 10K关注 0票数 1

在Linux上设置自定义波德率的方法是什么?

这个问题的答案必须是在一个级别的用户地低级别的API (ioctl,等等)。高于syscall的级别。至少在这些情况下,它应该有用:

  1. 编写基于低级C的使用串口的用户代码,
  2. 编写抽象串口功能的库,
  3. 编写内核串口驱动程序。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 01:49:16

不幸的是,这一切都依赖于司机。好的驱动程序将实现以下所有方法。坏的驱动程序只会实现其中的一些方法。因此,你需要尝试他们所有的。下面的所有方法都是在core.c中的助手函数中实现的。

以下4种选择是可用的。

  1. 标准波特率在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
  2. 如果您需要上面没有列出的费率,例如460800 (根据源代码注释,这是内核开发人员希望死的一种不推荐的攻击):
代码语言:javascript
复制
- 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。

  1. 您可以使用alt_speed设置任意速度,如下所示:
代码语言:javascript
复制
- 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`.

  1. 还可以通过如下自定义除数设置任意速度:
代码语言:javascript
复制
- 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设置它。

代码语言:javascript
复制
   // 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;    }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19440268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档