有两个命令用于设置"速度" - cfsetospeed
和cfsetispeed
。
但为什么只有一个"速度"由stty
显示?
根据bits/termios.h
,c_ispeed
和c_ospeed
是"输入速度"和"输出速度"。
我尝试将B4800
设置为"输入速度"和" B57600"到#34;输出速度",反之亦然
串行通道结束。但数据已损坏。如果无法设置,为什么有两个单独的速度
他们分开?
stty
显示由cfsetospeed
或cfsetispeed
设置的速度 - 以最后一个为准。
此外,B0
设置仅对cfsetospeed
生效。它在某处记录了吗?
此外,在设置B0
时,我可以以任何速度接收和传输数据
在B0
设置之前有效。它在某处记录了吗?它是未定义的行为还是在POSIX中?
修改
我在普通串口(即没有usb)上进行了相同的测试,并获得了以下与usb串口的奇怪区别:
普通串口使用9600"速度"如果我们设置B0
,那么
usb串口使用在B0
设置之前选择的任何速度。
(OS:Linux)
答案 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波特率指定器。