如何TTY"输入速度"不同于"输出速度"?

时间:2017-12-20 06:32:41

标签: tty termios

有两个命令用于设置"速度" - cfsetospeedcfsetispeed

但为什么只有一个"速度"由stty显示?

根据bits/termios.hc_ispeedc_ospeed是"输入速度"和"输出速度"。

我尝试将B4800设置为"输入速度"和" B57600"到#34;输出速度",反之亦然 串行通道结束。但数据已损坏。如果无法设置,为什么有两个单独的速度 他们分开?

stty显示由cfsetospeedcfsetispeed设置的速度 - 以最后一个为准。

此外,B0设置仅对cfsetospeed生效。它在某处记录了吗? 此外,在设置B0时,我可以以任何速度接收和传输数据 在B0设置之前有效。它在某处记录了吗?它是未定义的行为还是在POSIX中?

修改

我在普通串口(即没有usb)上进行了相同的测试,并获得了以下与usb串口的奇怪区别: 普通串口使用9600"速度"如果我们设置B0,那么 usb串口使用在B0设置之前选择的任何速度。

(OS:Linux)

1 个答案:

答案 0 :(得分:1)

  

如果不能单独设置它们,为什么有两种不同的速度?

一些(较旧的)UART(例如无处不在的8250及其后继器)实际上具有用于发送器的晶体输入和用于接收器的另一时钟输入。因此,输入波特率可能与此类UART上的输出波特率不同 但是大多数(如果不是全部)电路板将发送时钟馈送到接收时钟以否定此功能(例如,典型的8250 / 165x0 datasheet将显示由BAUDOUT输出驱动的RCLK输入)。
单独的termios速度元素只是反映了这种模糊的硬件功能(很少实际可用)。

SoC中的大多数UART(非基于8250)都有一个公共时钟输入用于发送和接收,因此波特率设置必须适用于两者。
所以指定"分开"波特率通常是无用的配置。

  

此外,B0设置仅在cfsetospeed中生效。它是在某处记录的吗?

代码是文档。
大多数串行端口驱动程序调用{​​{3}}中的 uart_get_baud_rate()来解码termios结构中的波特率设置。

/**
 *  uart_get_baud_rate - return baud rate for a particular port
 *  @port: uart_port structure describing the port in question.
 *  @termios: desired termios settings.
 *  @old: old termios (or NULL)
 *  @min: minimum acceptable baud rate
 *  @max: maximum acceptable baud rate
 *
 *  Decode the termios structure into a numeric baud rate,
 *  taking account of the magic 38400 baud rate (with spd_*
 *  flags), and mapping the %B0 rate to 9600 baud.
 *
 *  If the new baud rate is invalid, try the old termios setting.
 *  If it's still invalid, we try 9600 baud.
 *
 *  Update the @termios structure to reflect the baud rate
 *  we're actually going to be using. Don't do this for the case
 *  where B0 is requested ("hang up").
 */

请注意B0提到的特殊处理。

  

我在普通串口上进行了相同的测试(即没有usb),并且与usb串口获得了以下奇怪的区别:...

使用 uart_get_baud_rate()的驱动程序列表似乎不包含任何USB串行端口适配器:drivers/tty/serial/serial_core.c

您可能必须检查特定USB串行端口适配器的驱动程序,以便处理termios波特率指定器。