2017-12-20 2 views
0

"속도"- cfsetospeedcfsetispeed을 설정하는 두 가지 명령이 있습니다.TTY "입력 속도"가 "출력 속도"와 다른 점은 무엇입니까?

그러나 왜 단 하나의 "속도"가 stty으로 표시됩니까?

bits/termios.h에 따르면, c_ispeedc_ospeed은 "입력 속도"및 "출력 속도"입니다.

을 "입력 속도"로 설정하고 "B57600"을 "출력 속도"로 설정하려고 시도했으며 그 반대의 경우도 직렬 채널의 끝에서 시도했습니다. 그러나 데이터가 손상되었습니다. 을 따로 설정할 수 없다면 왜 두 가지 속도가 다른가요?

sttycfsetospeed 또는 cfsetispeed으로 설정된 속도를 나타냅니다.

게다가 B0 설정은 cfsetospeed과 함께 적용됩니다. 그것은 어딘가에 문서화되어 있습니까? 또한 B0이 설정되어 있지만 이 설정되기 전에 어떤 속도로든 이 활성화되어 데이터를 수신하고 전송할 수 있습니다. 그것은 어딘가에 문서화되어 있습니까? 정의되지 않은 동작입니까 아니면 POSIX에 있습니까?

는 편집 :

나는 일반 시리얼 포트 (즉, 아니 USB)에서 동일한 테스트를 실시하고 USB 직렬 포트는 아래의 호기심 차이를 얻을 : 우리가 설정 한 경우 일반 시리얼 포트가 9600 "속도"를 사용을 B0이고, usb 직렬 포트는 B0이 설정되기 전에 선택한 속도를 사용합니다.

(OS : 리눅스)가 별도로 설정하는 것은 불가능 경우

답변

1

왜 두 개의 별도의 속도가 있습니까?

UART (예 : 유비쿼터스 8250 및 그 후속 제품)에는 실제로 송신기에 대한 수정 입력 및 수신기에 대한 다른 입력이 있습니다. 따라서 입력 baudrate는 UART의 출력 baudrate와 다를 수 있습니다.
대부분의 보드가 모든 경우 수신 클록을 수신 클럭으로 공급하여 을 부정합니다 (예 : 일반적인 8250/165x0 datasheet에는 BAUDOUT 출력에 의해 구동되는 RCLK 입력이 표시됨).
별도의 termios 속도 요소는이 거의 모호한 하드웨어 기능 (실제로는 거의 사용 가능하지 않음)을 단순히 반영합니다.

SoC의 대부분의 UART (즉, 8250 기반이 아닌)는 전송 및 수신을위한 공통 클록 입력을 가지므로 전송 속도 설정은 두 가지 모두에 적용되어야합니다.
"별도의"전송 속도를 지정하는 것은 일반적으로 쓸모없는 구성입니다.

게다가 B0 설정은 cfsetospeed에서만 적용됩니다. 그것은 어딘가에 문서화되어 있습니까?

코드는 문서입니다.
대부분의 직렬 포트 드라이버는 uart_get_baud_rate()drivers/tty/serial/serial_core.c으로 호출하여 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 직렬 포트 어댑터가 포함되어 있지 않습니다 : https://elixir.free-electrons.com/linux/latest/ident/uart_get_baud_rate

특정 USB 직렬 포트 어댑터의 드라이버를 검사해야 할 수도 있습니다.

관련 문제