Serial.begin (): Mengapa tidak selalu menggunakan 28800?

35

Dalam banyak kode contoh online, orang menambahkan baris Serial.begin(9600)di blok pengaturan.

Ketika saya mencari apa yang Serial.begin()ada di dokumentasi resmi, ia mengatakan bahwa ia mengontrol bit per transfer data per detik.

Jadi pertanyaan yang jelas adalah, mengapa tidak menggunakan 28800, tingkat transfer tertinggi? Mengapa orang puas dengan 9600? Apa batasannya di sini?

Carlos - the Mongoose - Bahaya
sumber
3
FYI arduino yang paling tinggi dicolokkan ke dukungan USB sebenarnya adalah 115200, dan 57600 adalah baud yang paling umum kedua yang Anda lihat.
BrettAM

Jawaban:

48

Mengapa orang puas?

Orang puas karena lebih dari cukup cepat. Penggunaan yang paling umum adalah hanya untuk mencetak beberapa hal pada terminal untuk debuggin. 9600 baud adalah 960 karakter per detik, atau 12 x 80 karakter per detik. Seberapa cepat Anda bisa membaca? :)

Jika program Anda menggunakan port serial untuk transfer data massal, Anda akan memilih untuk tidak menyelesaikan.

Apa batasannya ...

Batas serial tinggi. Secara langsung Anda dapat menggunakan 115200 baud dalam program Anda dan itu hanya akan berfungsi. Terminal Arduino akan memungkinkan maksimum 115200, tetapi program lain seperti RealTerm akan membiarkan Anda berjalan lebih tinggi.

Serial perangkat keras akan berjalan ke 1 M baud. Jika Anda membaca di sekitar, Anda akan melihat orang-orang telah menggunakan hingga 1 M dengan langsung mengendalikan UART. Anda mungkin mendapatkan keuntungan dari baud rate yang tinggi untuk penggunaan seperti mentransmisikan melalui chip bluetooth. Jika Anda menggunakan antarmuka serial perangkat keras untuk bertukar dari chip ke chip hanya dengan jarak pendek, maka 1 M baud benar-benar layak. Pikirkan semua perangkat SPI dan I2C yang beroperasi dengan baik pada clock rate 1 MHz.

Pada jarak yang lebih jauh, Anda akan mulai memiliki masalah dengan noise ketika menggunakan pensinyalan level logika (0 hingga 5V). Untuk menggunakan jarak yang lebih besar, Anda akan menambahkan transceiver untuk memberikan pensinyalan yang kuat, umumnya RS-232 dan RS-485 yang kurang umum. Dengan RS-232 Anda bisa menjalankan bit mega pada jarak 10 kaki.

Kecepatan clock mikroprosesor akan menjadi batas sebenarnya. Dengan UART perangkat keras, prosesor harus memuat satu byte ke UART setiap 10 bit (untuk N81). Jadi ketika Anda mendapatkan 1 M baud itu akan menjadi tantangan bagi prosesor 16 MHz untuk menjaga UART disertakan dengan data. Byte baru akan dikirim setiap 160 jam, yang sangat sedikit baris kode. Untuk ledakan data singkat, Anda mungkin mencapai tingkat itu. Pesannya adalah, prosesor akan kehabisan kecepatan sebelum UART adalah batasnya.

Catatan, ini semua berlaku untuk HardwareSerial , serial perangkat lunak sangat berbeda.

jdr5ca
sumber
Harap dicatat 2M dapat diarsipkan dengan serial hw, tetapi implementasi arduino tampaknya terlalu lambat dan mengirim banyak sampah. Lihat atmega328p ds untuk menemukan bit ajaib untuk menggandakan kecepatan Anda. Juga menambahkan bahwa 9800 baud adalah standar yang sangat lama, dan banyak sensor menggunakan nilai itu sebagai standar, bahkan jika dapat dikonfigurasi untuk lebih banyak, seperti xbee, gps, dan banyak lagi. Juga serial over usb menggunakan auto-baudrate negosiasi penyihir dapat menggantikan baudate yang dipilih, tetapi saya pikir tidak digunakan oleh arduino (tetapi mungkin pada leonardo)
Lesto
1
9600 8N1 juga merupakan pengaturan default de-facto. Banyak perangkat dengan antarmuka serial dikirimkan dengan pengaturan ini dan perlu dikonfigurasi jika kecepatan lain (atau databits, parity bit, stop bit) diperlukan.
Peter Mortensen
"itu lebih dari cukup cepat" - Jawaban yang bagus, tapi saya agak tidak setuju dengan hal ini. Sebagian besar implementasi output debug memblokir, sehingga sangat diinginkan untuk membuat output debug secepat mungkin untuk mencegah perubahan berlebihan dalam waktu eksekusi kode.
Rev1.0
Jika Anda melakukan transfer data massal, Idealnya Anda akan menggunakan SPI, bukan?
tuskiomi
6

Selain semua jawaban yang menarik, perlu disebutkan bahwa pengaturan kecepatan serial ke XXX bits / s tidak perlu menyiratkan XXX bits / s pada perangkat keras.

Jam - bahkan berdasarkan kuarsa - tidak sempurna dan dapat terbawa arus. Selain itu, karena jam seri biasanya dihasilkan melalui power-of-two pre-divisor dan (integer) counter, semua nilai tidak dapat diperoleh secara akurat mengingat frekuensi clock dasar. Dengan bantuan bit start / stop, komunikasi serial asinkron mungkin toleran terhadap beberapa penyimpangan jam. Tapi ini ada batasnya.

Misalnya, jika ATmega328PA Anda berjalan pada 1MHz, Anda dapat mencapai 9600b / s pada 0,2% kesalahan. Tetapi pada 14400b / s kesalahannya adalah -3,5% (sebenarnya berkomunikasi pada 13900b / s). Dan pada 28800b / s, kesalahannya adalah 8,5% (sebenarnya berkomunikasi pada 31200b / s). Semua angka tersebut berasal dari lembar data ATmega48PA-88PA-168PA-328PA, p200 .

Ini bukan masalah ketika dua perangkat identik berkomunikasi bersama (karena pada kenyataannya berkomunikasi dengan kecepatan yang sama ). Ini mungkin menjadi masalah ketika berkomunikasi antara perangkat yang berbeda.

Meningkatkan frekuensi basis tidak perlu meningkatkan akurasi secara signifikan. Misalnya, menjalankan ATmega328PA yang sama seperti di atas pada 2MHz tidak benar-benar memberikan hasil yang lebih baik karena kebanyakan disebabkan oleh kesalahan pembulatan. Tetapi menjalankannya 1.8432MHz memberikan bps yang sangat akurat dari 2400b / s hingga 57.6kHz.

Sylvain Leroux
sumber
3

Saya pikir itu adalah semacam tradisi untuk menggunakan kecepatan transfer yang bukan yang paling lambat (300) tetapi juga bukan yang akhirnya dapat menyebabkan masalah dalam beberapa pengaturan (28800 atau bahkan 115200). Port serial PC (paling sering adaptor USB FTDI232) dapat mengatasi tingkat yang lebih tinggi tetapi perangkat keras DIY Anda mungkin tidak. Jadi 9600 bps telah memantapkan dirinya sebagai semacam transfer rate standar untuk contoh kode.

Dirk Grappendorf
sumber
2

Kembali dalam kabut waktu, "standar emas" untuk keyboard jarak jauh (menggunakan modem telepon, dan teletype, jika Anda ingat itu) adalah 9600 baud, awalnya hanya dapat dicapai melalui saluran telepon khusus. Waktu terus berjalan, perlahan; kemajuan teknologi, dengan cepat; dan ingatan bergerak lebih lambat dari waktu (tampaknya). Kami dapat berkomunikasi secara rutin, setidaknya lebih dari beberapa meter, dengan beberapa pesanan lebih cepat dari 9600 baud. Apa yang pernah dianggap sebagai standar emas bukan lagi emas, tetapi masih dianggap sebagai standar.

tl; dr: Ini sejarah, bukan teknologi.

JRobert
sumber
0

Saya pikir alasan utama orang menggunakan 9600 sebagian besar waktu adalah bahwa itu adalah baud rate default di Arduino IDE. Selain itu, kecepatan data yang lebih cepat juga bisa tidak dapat diandalkan jika sinyal serial harus menempuh perjalanan jauh - walaupun saya tidak tahu mengapa ini dipilih sebagai kecepatan optimal.

matega
sumber
-2

Waktu Reaksi Manusia

Karena dapat menghentikan monitor serial ketika Arduino Anda meronta-ronta pada port diperlukan oleh pengguna 100% dari waktu, dan memiliki kecepatan transfer maksimum diperlukan kurang dari 100% dari waktu.

9600 baud adalah kompromi antara "mudah untuk membunuh proses pelarian" dan "sangat lambat".

hoosierEE
sumber
100% hei ... menarik;)
Angry 84