Serial.begin (): Tại sao không luôn luôn sử dụng 28800?


35

Trong rất nhiều mã mẫu trực tuyến, mọi người thêm dòng Serial.begin(9600)trong khối thiết lập.

Khi tôi tìm kiếm những gì Serial.begin()trên tài liệu chính thức, nó nói rằng nó kiểm soát bit trên mỗi giây truyền dữ liệu.

Vì vậy, câu hỏi rõ ràng là, tại sao không sử dụng 28800, tốc độ truyền cao nhất? Tại sao mọi người giải quyết cho 9600? Giới hạn ở đây là gì?


3
FYI, một arduino cao nhất được cắm vào các hỗ trợ USB thực sự là 115200 và 57600 thường là baud phổ biến thứ hai mà bạn thấy.
BrettAM

Câu trả lời:


48

Tại sao mọi người giải quyết?

Mọi người giải quyết vì nó là quá đủ nhanh. Việc sử dụng phổ biến nhất chỉ là in một số nội dung trên thiết bị đầu cuối để gỡ lỗi. 9600 baud là 960 ký tự mỗi giây, hoặc 12 x 80 ký tự mỗi giây. Bạn có thể đọc nhanh như thế nào? :)

Nếu chương trình của bạn đang sử dụng cổng nối tiếp để truyền dữ liệu hàng loạt, bạn sẽ chọn không giải quyết.

Giới hạn là gì ...

Các giới hạn trên nối tiếp là cao. Trực tiếp bạn có thể sử dụng 115200 baud trong các chương trình của bạn và nó sẽ chỉ hoạt động. Thiết bị đầu cuối Arduino sẽ cho phép tối đa 115200, nhưng các chương trình khác như RealTerm sẽ cho phép bạn chạy cao hơn.

Phần cứng nối tiếp sẽ chạy đến 1 M baud. Nếu bạn đọc xung quanh bạn sẽ thấy mọi người đã sử dụng tới 1 M bằng cách điều khiển trực tiếp UART. Bạn có thể nhận được lợi ích của tốc độ truyền cao cho các mục đích sử dụng như truyền qua chip bluetooth. Nếu bạn đang sử dụng giao diện nối tiếp phần cứng để trao đổi từ chip sang chip chỉ với một khoảng cách ngắn, thì 1 M baud là hoàn toàn khả thi. Hãy nghĩ về tất cả các thiết bị SPI và I2C chỉ hoạt động tốt ở tốc độ xung nhịp 1 MHz.

Trong khoảng cách lớn hơn, bạn sẽ bắt đầu gặp vấn đề với nhiễu khi sử dụng tín hiệu mức logic (đồng bằng 0 đến 5V). Để sử dụng khoảng cách lớn hơn, bạn sẽ thêm một bộ thu phát để cung cấp tín hiệu mạnh mẽ, thường là RS-232 và ít phổ biến hơn RS-485. Với RS-232, bạn có thể chạy một bit lớn ở khoảng cách 10 feet.

Tốc độ xung nhịp của bộ vi xử lý sẽ là giới hạn thực. Với UART phần cứng, bộ xử lý phải tải một byte cho UART cứ sau 10 bit (đối với N81). Vì vậy, khi bạn đạt tới 1 M baud, sẽ là một thách thức đối với bộ xử lý 16 MHz để giữ cho UART được cung cấp dữ liệu. Một byte mới sẽ được gửi sau mỗi 160 đồng hồ, đó là rất ít dòng mã. Đối với một đợt dữ liệu ngắn, bạn có thể đạt được tốc độ đó. Thông báo là, bộ xử lý sẽ hết tốc độ trước khi UART là giới hạn.

Lưu ý, tất cả điều này áp dụng cho Phần cứng , phần mềm nối tiếp rất khác nhau.


Xin lưu ý rằng 2M có thể lưu trữ được với hw serial, nhưng việc triển khai arduino có vẻ quá chậm và gửi rất nhiều rác. Xem atmega328p ds để tìm bit ma thuật để tăng gấp đôi tốc độ của bạn. Ngoài ra, thêm rằng 9800 baud là một tiêu chuẩn rất cũ và rất nhiều cảm biến sử dụng giá trị đó làm tiêu chuẩn, ngay cả khi có thể được định cấu hình cho nhiều hơn, như xbee, gps, v.v. Ngoài ra nối tiếp qua usb sử dụng phù thủy đàm phán tự động baudrate có thể ghi đè lên baudate đã chọn, nhưng tôi nghĩ là không được arduino sử dụng (nhưng nó có thể là trên leonardo)
Lesto

1
9600 8N1 cũng là một thiết lập mặc định thực tế. Nhiều thiết bị có giao diện nối tiếp được phân phối với cài đặt này và cần được định cấu hình nếu cần một tốc độ khác (hoặc cơ sở dữ liệu, bit chẵn lẻ, bit dừng).
Peter Mortensen

"nó là quá đủ nhanh" - Câu trả lời tốt, nhưng tôi hơi không đồng ý với điểm này. Hầu hết các triển khai đầu ra gỡ lỗi đều bị chặn, do đó, rất mong muốn làm cho đầu ra gỡ lỗi càng nhanh càng tốt để ngăn chặn các thay đổi quá mức trong thời gian thực thi mã.
Rev1.0

Nếu bạn đang thực hiện chuyển dữ liệu hàng loạt, lý tưởng nhất là bạn đang sử dụng SPI, phải không?
tuskiomi

6

Ngoài tất cả các câu trả lời thú vị, nó đáng nói đến là thiết lập tốc độ nối tiếp để XXX bit / s không cần thiết bao hàm XXX bit / s trên phần cứng.

Đồng hồ - thậm chí dựa trên thạch anh - là không hoàn hảo và có thể trôi. Ngoài ra, vì đồng hồ nối tiếp thường được tạo thông qua bộ đếm tiền chia hai và bộ đếm (số nguyên), tất cả các giá trị không thể được lấy chính xác với tần số xung nhịp cơ sở. Với sự trợ giúp của các bit start / stop, giao tiếp nối tiếp không đồng bộ có thể được chấp nhận đối với một số trôi đồng hồ. Nhưng điều này có giới hạn.

Ví dụ: nếu ATmega328PA của bạn đang chạy ở tốc độ 1 MHz, bạn có thể đạt 9600b / giây với 0,2% lỗi. Nhưng với tốc độ 14400b / giây, lỗi là -3,5% (thực tế giao tiếp ở mức 13900b / giây). Và ở tốc độ 28800b / giây, sai số là + 8,5% (thực tế giao tiếp ở tốc độ 31200b / giây). Tất cả những số liệu này là từ bảng dữ liệu ATmega48PA-88PA-168PA-328PA, p200 .

Đây không phải là vấn đề khi hai thiết bị giống hệt nhau giao tiếp với nhau (vì thực tế có giao tiếp với tốc độ như nhau ). Nó có thể là một vấn đề khi giao tiếp giữa các thiết bị khác nhau.

Việc tăng tần số cơ bản không cần thiết cải thiện đáng kể độ chính xác. Ví dụ: chạy cùng ATmega328PA như trên ở mức 2 MHz không thực sự cho kết quả tốt hơn vì hầu hết là do lỗi làm tròn. Nhưng chạy nó 1.8432 MHz cho bps rất chính xác từ 2400b / s lên đến 57,6kHz.


3

Tôi nghĩ rằng đó là một loại truyền thống để sử dụng tốc độ truyền tải không phải là tốc độ chậm nhất (300) nhưng cũng không phải là truyền thống cuối cùng có thể gây ra sự cố trong một số thiết lập (28800 hoặc thậm chí 115200). Cổng nối tiếp PC (thường là bộ chuyển đổi USB FTDI232) có thể đáp ứng với tốc độ cao hơn nhưng phần cứng DIY của bạn thì không. Vì vậy, 9600 bps đã tự thiết lập như một loại tốc độ truyền tiêu chuẩn cho các ví dụ mã.


2

Quay ngược thời gian, "tiêu chuẩn vàng" cho bàn phím từ xa (sử dụng modem điện thoại aa và teletypes, nếu bạn nhớ chúng) là 9600 baud, ban đầu chỉ có thể đạt được qua một dòng điện thoại chuyên dụng. Thời gian trôi đi, từ từ; tiến bộ công nghệ, nhanh chóng; và bộ nhớ di chuyển thậm chí chậm hơn thời gian (dường như). Chúng ta có thể thường xuyên liên lạc, ít nhất là trên một vài mét, với một vài đơn đặt hàng có cường độ nhanh hơn 9600 baud. Những gì đã từng được coi là tiêu chuẩn vàng không còn là vàng, nhưng vẫn được coi là tiêu chuẩn.

tl; dr: Đó là lịch sử, không phải công nghệ.


0

Tôi nghĩ lý do chính khiến mọi người sử dụng 9600 hầu hết thời gian là vì tốc độ truyền mặc định trong Arduino IDE. Ngoài ra, tốc độ dữ liệu nhanh hơn cũng có thể không đáng tin nếu tín hiệu nối tiếp phải truyền đi một chặng đường dài - mặc dù tôi không biết tại sao điều này được chọn là tốc độ tối ưu.


-2

Thời gian phản ứng của con người

Bởi vì việc có thể dừng màn hình nối tiếp khi Arduino của bạn đập vào cổng được người dùng yêu cầu 100% thời gian và tốc độ truyền tối đa được yêu cầu ít hơn 100% thời gian.

9600 baud là một sự thỏa hiệp giữa "dễ dàng giết chết quá trình chạy trốn" và "chậm một cách khó chịu".


100% hey ... thú vị;)
Tức giận 84
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.