Dò tốc độ baud tự động

AUTO BAUD RATE DETECTION

Dò tốc độ baud tự động
by Eddy Carroll, April 1989

Bài viết ở bên dưới sẽ giải thích cách xác định tốc độ baud tự động của thiết bị đầu cuối khi giao tiếp nối tiếp bằng cách phân tích ký tự gửi từ thiết bị đầu cuối đó.

Ký tự dùng trong bài này đó là ký tự RETURN , bởi mô hình nhị phân cuả nó có các tính chất mong muốn nhất định. mặt dù kỹ thuật được mô tả dưới đây có thể áp đối với các ký tự khác

Cách tiếp cận ở đây chúng ta thiết lập tốc độ baud là 9600 và chờ ký tự được gửi từ thiết bị đầu cuối. Tốc độ baud có thể rơi vào 1 trong ba nhóm chính

            Baud > 9600

            Baud > 1200 và Baud <= 9600

            Baud < 1200

Ba trường hợp được xử lý một cách riêng biệt như sau:

 

Phân tích mô hình ký tự return

Mô hình nhị phân của ký tự return (0X0D) được truyền qua đường truyền nối tiếp có dạng như sau

            0 1 0 1 1 0 0 0 0 1

            | \_____________/  |

            |    Data bits            |

          Start                      Stop

           bit                          bit

(The least significant data bits are always transferred first.)

 (Bít dữ liệu có trọng số nhỏ nhất luôn luôn được truyền đầu tiên)

Thời gian để truyền mỗi bit, T, phụ thuộc vào tốc độ baud. Ví dụ T19200=T9600/2. bởi vậy khoảng thời gian để truyền một bit đơn tại tốc độ baud 9600, với khoảng thời gian đó thì tại tốc độ baud 19200 có thể truyền 2 bit

Tương tự như vậy, nếu có hai bit được truyền tại tốc độ baud 9600, thì chỉ có một bit được truyền tại tốc độ baud 4800 tại cùng một khoảng thời gian. Nếu thiết bị nhận cố định tốc độ baud là 9600, ký tự Return được nhận dạng khác nhau, phụ thuộc vào tốc độ truyền tại thiết bị gởi. Bảng theo sau miêu tả:

 

Baud

mô hình bit nhận tại tốc độ baud 9600

Byte

19200

01011000011111111111                    

 

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 

 

0x00

 

 

Với ngoại lệ tại mục baud 19200 và 1800 , tất cả các mô hình bit biến đổi chính xác của mô hình cho 9600. Mười bit đầu tiên của mỗi mô hình tương ứng với một byte đầy đủ tại 9600 baud, byte này được liệt kê trong cột Byte trong bảng trên. Sự vắng mặt của một bit  stop trong một số các mô hình sẽ gây ra một lỗi khung xảy ra, nhưng điều này có thể được bỏ qua - các byte này vẫn được thể hiện.

Nếu thiết bị truyền ký tự RETURN tại tốc độ baud là 1200, thiết bị nhận thiết lập tại tốc độ baud 9600 sẻ nhận được byte có giá trị là : 0x80. Tất cả các byte là duy nhất, do đó nó có thể xác định duy nhất tốc độ truyền

Tại tốc đô 19200 có một chúc khác biệt, khi đó hai bit được gửi tốc độ baud 19200 sẽ được hiểu duy nhất như là 1 bit đơn tại tốc độ 9600. Tại cặp bit 01 và 10 có thể được hiểu như hoặc là 0 hoặc là 1, phụ thuộc vào phần cứng . Thật may mắn chỉ có bit 0 và bit 4 bị vấn đề này, phần còn lại được set đến 1.

Như vậy, vào 9600 baud, nibble cao của byte nhận được sẽ luôn luôn được 0xF. Nibble thấp có thể là một trong những giá trị, nhưng nó sẽ không phải là một 0, kể từ khi có một cặp liền kề 1 bit mà sẽ gây ra ít nhất một 1 xuất hiện trong nibble thấp. Vì vậy, toàn bộ byte sẽ có dạng 0xF ?, nơi nibble thấp không phải là 0.

tại tốc độ baud 1800 , mọi thứ hơi phức tạp bởi thực tế là T1800 = T9600 * 16/3. Do đó, quá trình chuyển đổi từ 0 đến 1 không diễn ra trên đường biên bít đối với 9600 baud. Bảng này cho thấy chính xác một quá trình chuyển đổi như vậy xảy ra trong vòng 10 bit đầu tiên, và như vậy bằng cách cho phép hai khả năng (tùy thuộc vào việc các bit ở vị trí đó được hiểu như là một 1 hay 0), một trong hai byte sẽ được nhận được khi truyền tốc độ là 1800 baud.

Một kỹ thuật tương tự có thể được áp dụng cho tốc độ của 3600 và 7200 nhưng số lượng các bit 'không ổn định' sẽ tăng, và kết quả là nhiều hơn kết hợp để kiểm tra. Kể từ khi tốc độ truyền của 3600 và 7200 gần như không bao giờ sử dụng , đây không phải là một vấn đề lớn.
   At 1800 baud, things are slightly complicated by the fact that T1800 = T9600 * 16/3. Hence, transitions from 0 to 1 do not take place on bit boundaries with respect to 9600 baud. The table shows that exactly one such transition occurs within the first 10 bits, and so by allowing two possibilities (depending on whether the bit at that position gets interpreted as a 1 or a 0), one of two bytes will be received when the transmit speed is 1800 baud.
   A similar technique could be applied to speeds of 3600 and 7200 but the number of 'unstable' bits would increase, and result in more combinations to check. Since baud rates of 3600 and 7200 are almost never used anyway, this is not a major problem.

Detecting slower baud rates
We can now uniquely distinguish between all the speeds from 19200 to 1200 baud on the basis of a single byte received. Speeds below 1200 baud however all return a byte of 0x00, so while we can detect that the speed is below 1200, nothing more can be determined from the byte value alone.
   To get around this problem, we simply wait for the next byte to be received at 9600 baud. Since each bit transmitted at low speeds corresponds to at least one complete byte at 9600 baud, each transition from 1 to 0 will cause the serial hardware to appear receive a new byte at 9600 baud.
   Let's look at the start of our RETURN character again, for rates less than 1200 baud:

Baud    Bit Pattern at 9600 baud    Delay   Time

 600     16 0's   16 1's   16 0's     32   3.33 ms

 300     32 0's   32 1's   32 0's     64   6.66 ms

 150     64 0's   64 1's   64 0's    128  13.33 ms

 110     87 0's   87 1's   87 0's    174  18.13 ms

  75    128 0's  128 1's  128 0's    256  26.66 ms

  50    192 0's  192 1's  192 0's    384  40.00 ms

At 600 baud, the first transition from 1 to 0 occurs immediately, and this is what triggers off the initial 0x00 byte we receive. The next transition occurs exactly (16 + 16) * T9600 seconds after the initial transition, and this will cause the serial hardware to think another byte is about to arrive.
   The serial hardware tells us the first byte has arrived exactly 10 * T9600 seconds after the first transition, and tells us about the second byte (16 + 16 + 10) * T9600 after the first transition. Hence, the delay between the first and second bytes arriving when the transmission speed is 600 baud is (16 + 16 + 10 - 10) * T9600 seconds, which is 32 * T9600 seconds.
   The number of T9600 periods which pass is shown in the Delay column in the table above. T9600 is actually 104.16 microseconds, so multiplying these together gives us the actual delay in seconds between the two bytes. This is listed in the final column.
   Armed with this information, we can now easily determine the transmission baud rate: simply time the delay between the arrival of the first and second bytes, then scan a table of time constants to see which baud rate it most closely matches. This approach allows the timing to be a little off while still producing an accurate estimate of the baud rate.

An algorithm for auto baud rate detection
Now that we know how to detect all the baud rates, we can present a complete algorithm that combines all the techniques just described:

;

;   Pseudo code to determine what baud rate a

;   transmitter is at, on the basis of a single

;   RETURN (0x0D) character received from it.

;

;

Initialise receive baud rate to 9600

Wait for Byte to be received

 

IF Byte = 0x00 THEN

    Start Timer

    REPEAT

    UNTIL (Timer > 50 ms OR New Byte Received)

 

    CASE Timer IN

         1 ms - 4  ms:  --> 600 Baud

         5 ms - 10 ms:  --> 300 Baud

        11 ms - 15 ms:  --> 150 Baud

        16 ms - 22 ms:  --> 110 Baud

        23 ms - 32 ms:  -->  75 Baud

        33 ms - 49 ms:  -->  50 Baud

                 ELSE:  --> Timed out; reset

    END CASE;

ELSIF Byte >= 0xF1 THEN

    --> 19200 Baud

ELSE

    CASE Byte IN

        0x0D: --> 9600 Baud

        0xE6: --> 4800 Baud

        0x78: --> 2400 Baud

   0xE0,0xF0: --> 1800 Baud

        0x80: --> 1200 Baud

        ELSE: --> Line noise; reset

    END CASE

END IF

 

Các bài viết khác