컴퓨터 지식 네트워크 - 컴퓨터 프로그래밍 - 어떤 바이너리 비트 시퀀스인가요?

어떤 바이너리 비트 시퀀스인가요?

범주: 컴퓨터/네트워크 >> 프로그래밍 >> 기타 프로그래밍 언어 ​​

문제 설명:

어떤 이진 비트 시퀀스입니까?

분석:

1 기본 방법

캐리지 리턴 문자의 ASCII 값은 0x0D입니다. 직렬 통신에서는 시작 비트와 정지 비트가 추가됩니다. 비트 전송 순서는 일반적으로 하위 비트를 먼저 전송한 다음 상위 비트를 전송하는 것입니다. 이때 캐리지 리턴 문자의 이진 표현은 다음과 같습니다.

300)this.width=300" border=0>

그림 1 캐리지 리턴 문자의 비트 시퀀스

직렬 통신에서 하나의 이진 비트 전송 시간(T로 표시)은 통신 전송 속도에 따라 달라집니다. 9600 보드에서 하나의 이진 비트 전송 시간은 19200에서 하나의 이진 비트 전송 시간의 두 배입니다. 즉, 2*T19200=T 9600입니다. 따라서 9600baud의 한 비트 전송 시간은 19200baud에서만 전송될 수 있습니다. 마찬가지로 9600baud의 두 비트 전송 시간은 4800baud에서만 전송될 수 있습니다. 1비트 호스트는 수신 전송 속도를 9600으로 설정합니다. 호스트는 터미널이 9600 전송 속도로 문자를 보내는 경우에만 문자를 올바르게 수신할 수 있습니다. 전송 전송 속도가 9600보다 높거나 낮으면 호스트가 수신하는 문자는 다음과 같습니다. 잘못된 수신 전송 속도는 9600입니다. 터미널이 다른 전송 속도로 캐리지 리턴 문자를 보낼 때 호스트가 수신한 바이너리 시퀀스는 표 1에 표시됩니다.

표 1에서 볼 수 있는 것과 같지만, 19200 및 19200의 경우. 1800보드에는 두 가지 특수한 경우가 있습니다. 다른 경우의 바이너리 시퀀스는 9600보드의 바이너리 시퀀스 변환입니다. 처음 10개의 바이너리 비트는 정지 부족을 무시하고 9600보드의 바이너리 비트에 해당합니다. 비트 '1'. 수신된 문자를 바이트 단위로 나타냅니다(표 1의 가장 오른쪽 열에 표시됨). 예: 전송 속도가 1200보드이고 수신 속도가 9600보드인 경우 호스트는 올바른 캐리지 리턴 문자 0x0D 대신 0x80입니다. 획득한 바이트는 전송 속도(9600, 4800, 2400, 1200)에 따라 다르기 때문에 전송 속도는 수신된 문자를 판단하여 결정할 수 있습니다. >

전송 전송 속도가 19200일 때 전송 속도는 수신 속도(9600 전송 속도)의 정확히 두 배이므로 전송 측의 두 바이너리 비트는 다른 직렬에 따라 수신 측에서 1로 간주됩니다. 하드웨어에서는 두 개의 이진 비트 조합 '01'과 '10'이 '1' 또는 '0'으로 간주될 수 있습니다. 다행스럽게도 비트 0~4에만 이러한 모호성 문제가 있습니다. 왜냐하면 다음 비트가 정지 비트이기 때문입니다. 따라서 전송률이 19200baud일 때 수신된 문자의 상위 절반 바이트는 여러 값 중 하나일 수 있지만 0x0D에 인접한 '1'이 두 개 있으므로 이는 0x0이 되지 않습니다. 하위 절반 바이트에 '1'이 하나 이상 있으므로 전체 바이트는 0xF? 형식이고 하위 절반 바이트는 0이 아닙니다.

표 1 다양한 전송 속도의 바이너리 시퀀스

전송 속도

수신된 바이너리 비트 시퀀스

바이트 표현

19200

0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1

0xF?

9600

0 1 0 1 1 0 0 0 0 1

0x0D

4800

0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1

0xE6

2400

0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1

0x78

1800

0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

0xE0

1800

0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

0xF0

1200

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0

0x80

600

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

0x00

300

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0x00

150

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0x00

110

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0x00

전송 속도가 1800보드인 경우

T1800=T9600*16/3,

그리고 16/ 3은 정수가 아닙니다. 수신단의 이진 비트 상태 전환 순간은 9600보드와 일대일로 일치하지 않으므로 수신단의 비트 수신 주기 내에서 상태가 변경될 가능성이 있습니다. 이는 표 1에 제공된 여섯 번째 비트(x로 표시)의 경우입니다. x는 '1' 또는 '0'으로 간주될 수 있으므로 전송 속도가 1800baud일 때 수신된 바이트는 0xE0 또는 0xF0일 수 있습니다. 전송 속도가 3600과 7200인 경우에도 동일한 문제가 발생합니다. 동일한 방법을 사용할 수도 있지만 불확실한 비트 수가 늘어나고 감지해야 하는 바이트 유형도 많아집니다. 3600baud와 7200baud의 전송 속도는 거의 사용되지 않으므로 이 문제는 심각하지 않습니다. 송신 전송 속도가 1200에서 19200 사이인 한 수신된 문자를 통해 전송 속도를 고유하게 결정할 수 있습니다.

2 낮은 전송 속도 감지

전송 속도가 1200 전송 속도보다 낮을 때 수신 측에서 수신한 바이트는 모두 0x00이므로 속도가 1200 전송 속도인지만 확인할 수 있습니다. 12 00 보드보다 낮으면 더 이상 정보를 얻을 수 없습니다. 이 문제를 해결하기 위해 다음 정보 바이트를 9600보드 속도로 수신할 수 있습니다. 전송 속도가 600baud 이하인 경우 1비트의 전송 시간은 9600baud의 전체 바이트 수신 시간보다 길다. 따라서 송신측에서 '1'(정지 비트)에서 '0'(시작 비트)으로 전환할 때마다 수신측에서는 새 바이트가 시작되었다고 생각하게 됩니다. 표 2는 600보드 이하의 전송 속도에 대한 수신 측 캐리지 리턴 문자의 이진 시퀀스를 보여줍니다(처음 몇 비트만 표시됨).

표 2 낮은 전송 속도 캐리지 리턴 문자 수신 방법

전송 속도

9600 전송 바이너리 시퀀스

시간 차이

(주기)

시차

(실시간)

600

16 0의 16 1의 16 0의 < /p >

32

3.33ms

300

32 0 32 1 32 0

64

6.66ms

150

64 0 64 1 64 0

128

13.33ms

110

p>

87 0 87 1 87 0

174

18.13ms

75

128 0 128 1 128 0

256

26.66ms

50

192 0 192 1 192 0

384

4 0.00ms

600 보드에서는 초기화 직후 '1'에서 '0'으로의 첫 번째 전환이 발생합니다. 이 전환은 수신 종료 바이트 0x00을 제공합니다. 두 번째 전환은 초기화(16+16)*T9600초 후에 발생하며, 이로 인해 수신측에서는 다른 바이트가 수신되기 시작했다고 생각하게 됩니다. 한 바이너리 비트의 수신 시간은 T9600이므로 직렬 인터페이스 회로는 첫 번째 전환 후 10* T9600초 후에 첫 번째 바이트가 수신되었음을 알리고 (16+16+10)* T96 00초 후에 두 번째 바이트를 메시지로 표시합니다. . 2바이트가 수신되었습니다. 따라서 600보드에서 첫 번째 바이트 수신 완료와 두 번째 바이트 수신 완료 사이의 시간 차이는 (16+16+10-10)*T9600=32*T9600초입니다. 표 2의 세 번째 열은 이러한 시간차를 T9600의 개수로 표현한 것이다. T9600=1/9600초=104.16밀리초이므로 곱셈은 수신되는 두 바이트 간의 실시간 차이를 얻을 수 있습니다. 다양한 전송 전송 속도에 대한 시간 차이는 표 2의 마지막 열에 나와 있습니다. 이 시차 정보를 이용하면 낮은 전송률에서의 전송 속도를 판단할 수 있습니다. 첫 번째와 두 번째 바이트의 수신 시간 차이를 측정한 후 시차 상수 표(표 2)에서 어느 전송 속도가 더 낮은지 알아냅니다. 시간차는 가장 가깝고 터미널에서 보낸 전송 속도에 해당합니다. 측정된 시간차에 약간의 오류가 있더라도 일반적으로 전송 속도는 올바르게 결정될 수 있습니다.

3 구현 방법

위의 분석을 통해 캐리지 리턴 문자의 정보를 송수신하여 다양한 전송 속도를 측정할 수 있습니다. 알고리즘 구현의 의사 코드는 마지막에 제공됩니다. 이 기사 밖으로. 적용 사례를 통해 이 방법의 효율성이 입증되었습니다.

; 단일 RETURN(0x0D)을 기준으로 tran *** itter의 전송 속도를 결정하는 의사 코드입니다. 문자를 수신합니다.

수신 전송 속도를 9600으로 초기화합니다.

바이트가 수신될 때까지 기다립니다.

IF Byte = 0x00 THEN

타이머 시작

REPEAT

UNTIL(타이머 > 50ms 또는 새 바이트 수신됨)

CASE 타이머 IN

1ms-4ms :? 600보드

5ms~10ms:? 300보드

11ms~15ms:? 16ms~22ms:? 110보드

23ms-32ms:? 75보드

33ms-49ms:? 50보드

시간 초과됨

p>

END CASE;

ELSIF 바이트 >= 0xF1 THEN

? 19200 보드

ELSE

CASE 바이트 IN

0x0D:? 9600 보드

0xE6:? 4800 보드

0x78:? 2400 보드

0xE0,0xF0:? /p>

0x80:? 1200 보드

ELSE:? 회선 잡음 재설정

END CASE

END IF■

上篇: 작업 관리자 프로세스가 중지되면 다시 시작하거나 종료할 수 있습니다. 下篇: Abc 휴대폰 은행은 왜 이체를 할 수 없습니까?
관련 내용