Apa itu Serial.begin (9600)?

22

Saya tahu ini untuk menginisialisasi sesuatu:

Serial.begin(9600);

Tapi saya ingin tahu apa artinya itu?

shajib0o
sumber
3
Dokumentasi memiliki deskripsi yang baik tentang itu. arduino.cc/en/Serial/begin
sachleen

Jawaban:

22

Serial.begin(9600)sebenarnya tidak mencetak apa pun. Untuk itu Anda ingin menggunakan Serial.print("Hello world!")untuk mencetak teks "Halo dunia!" ke konsol serial. Sebaliknya itu menginisialisasi koneksi serial di 9600 bit per detik.

Kedua sisi koneksi serial (yaitu Arduino dan komputer Anda) perlu diatur untuk menggunakan koneksi serial kecepatan yang sama untuk mendapatkan segala jenis data yang dapat dipahami. Jika ada ketidaksesuaian antara apa yang kedua sistem pikirkan tentang kecepatan maka data akan kacau.

9600 bit per detik adalah default untuk Arduino, dan sangat memadai untuk sebagian besar pengguna, tetapi Anda dapat mengubahnya ke kecepatan lain: Serial.begin(57600)akan mengatur Arduino untuk mengirimkan pada 57600 bit per detik. Anda harus mengatur perangkat lunak apa pun yang Anda gunakan di komputer Anda (seperti monitor serial Arduino IDE) dengan kecepatan yang sama untuk melihat data yang dikirim.

heypete
sumber
2
Baud dan BPS adalah dua hal yang berbeda ... tidak dapat menemukan tautan yang saya cari sekarang.
Penguin Anonim
bagaimana jika saya meletakkan "Serial.begin (0);" atau "Serial.begin (4000);". Maksud saya, saya ingin tahu apa perbedaan antara angka-angka?
shajib0o
3
Serial.begin digunakan untuk mengatur kecepatan komunikasi, dalam bit per detik. Satu byte sama dengan 8 bit, tetapi koneksi serial mengirim bit start dan stop untuk mengidentifikasi awal dan akhir byte tertentu ke sistem penerima. Jadi, 10 bit diperlukan untuk mengirim satu karakter. Menggunakan Serial.begin(0)memberitahu Arduino bahwa ia harus berkomunikasi dengan serial pada 0 bit per detik. Seperti yang Anda harapkan, ini berarti bahwa Arduino tidak akan pernah mengirim data sama sekali. Serial.begin(4000)akan menyebabkan Arduino mengirim data pada 4000 bit per detik. Ini tidak standar, tetapi dinyatakan baik.
heypete
2
Singkatnya: mengubah angka mengubah kecepatan. Membuat angka lebih kecil (mis. Serial.begin(300)) Membuat Arduino mengirim data lebih lambat. Meningkatkannya, katakanlah ke 57600 akan mengirim data lebih cepat. Baik sistem pengiriman maupun sistem penerima harus menyetujui kecepatan apa yang digunakan: program serial komputer Anda, seperti jendela Arduino Serial Monitor, akan memungkinkan Anda mengatur kecepatan komputer Anda akan menerima data tetapi Anda hanya dapat memilih dari yang umum kecepatan: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 dan 11520 bit / detik. Anda tidak dapat memasukkan kecepatan lain, seperti 4000. 9600 biasanya baik.
heypete
Baud and BPS are two different things... can't find the link I was looking for now.- Inilah satu penjelasan: Lampiran C: "baud" vs. "bps"
Nick Gammon
21

Sebuah gambar bernilai 1000 kata, jadi kata mereka, (1024 kata jika Anda bekerja dengan komputer) jadi saya akan memposting beberapa gambar ...

Saya mengatur Uno saya untuk mengirim "Fab" pada 9600 baud dan menangkap hasilnya pada penganalisis logika.

Serial comms - 3 surat

Bagian-bagian yang diarsir dalam warna merah adalah periode "idle" antara byte.

Dari catatan grafik di atas bahwa baris data Tx (mengirimkan) biasanya tinggi (1) sampai turun rendah untuk menunjukkan awal karakter (byte). Ini adalah bit awal . Kemudian 8 bit data (ditunjukkan oleh titik putih) muncul pada kecepatan baud (9600 sampel per detik). Setelah itu garis dibawa tinggi lagi. Ini adalah bit stop (bagian merah). Kemudian kita melihat bit mulai untuk karakter berikutnya, dan seterusnya. Bagian "stop" bisa panjang tanpa batas, namun harus setidaknya satu bit panjang.


Lebih detail untuk karakter pertama (huruf "F" atau 0x46 atau 0b01000110) dapat dilihat di sini:

Serial comms - satu byte

  • A - tidak ada data (Tx tinggi)

  • B - "mulai bit". Baris diambil rendah untuk memberi tahu penerima bahwa suatu karakter (byte) mulai dikirim. Penerima menunggu satu setengah jam sebelum mengambil sampel saluran.

  • C - Karakter pertama tiba (huruf "F" atau 0x46 atau 0b01000110). Tidak ada bit jam seperti itu, data yang masuk hanya sampel pada tingkat baud (transmisi). Berbeda dengan komunikasi SPI, data yang diterima bit paling signifikan pertama (jika Anda tidak mengirim 8 bit per byte). Jadi kita melihat 01100010 (bukan 01000110).

  • D - Berhenti sedikit. Ini selalu tinggi, untuk memastikan bahwa kita dapat membedakan antara akhir byte ini, dan awal byte berikutnya. Karena bit start adalah nol, dan bit stop adalah bit, selalu ada transisi yang jelas dari satu byte ke byte berikutnya.

  • E - Bit awal untuk karakter berikutnya.


Anda dapat melihat dari tangkapan penganalisa logika T1 - T2yaitu 0,1041667 ms, dan ketika itu terjadi 1/9600:

1 / 9600 = 0.00010416666 seconds

Dengan demikian laju 9600 memberi Anda jumlah bit per detik dan kebalikannya adalah interval waktu antara bit .


Pertimbangan lainnya

  • Serial comms tidak dapat beroperasi sendiri (tidak seperti SPI atau I2C, dan lainnya) sehingga pengirim dan penerima harus menyetujui laju jam.

  • Tingkat jam tidak tepat pada Arduino, karena perangkat keras harus membagi jam sistem untuk mendapatkan jam seri, dan pembagian tidak selalu tepat. Hampir selalu ada kesalahan, jumlahnya diberikan dalam lembar data (angka dikutip untuk jam sistem 16 MHz, seperti pada Uno):

    Kesalahan baud rate serial

  • Anda dapat memvariasikan jumlah bit data, Anda tidak harus mengirim 8 bit, bahkan Anda bisa mengirim 5 hingga 9 bit.

  • Secara opsional dapat ada bit paritas yang dikirim setelah bit data.

    • Jika Anda menentukan paritas "ganjil", bit paritas diatur sedemikian rupa sehingga jumlah total 1-bit ganjil.
    • Jika Anda menentukan paritas "genap", bit paritas diatur sedemikian rupa sehingga jumlah total 1-bit genap.
    • Jika Anda menentukan tidak ada paritas, bit paritas dihilangkan.

    Ini dapat membantu penerima mendeteksi apakah data tiba dengan benar atau tidak.

  • Bit paritas dikirim sebelum bit berhenti.

  • Dalam kasus 9 bit data (seperti yang digunakan dalam protokol SeaTalk), bit paritas diartikan kembali sebagai bit data ke-9. Karenanya Anda tidak dapat memiliki 9 bit data dan bit paritas.

  • Anda juga dapat memiliki dua bit stop. Ini pada dasarnya hanya memperpanjang waktu antar byte. Dalam "masa lalu" ini adalah agar peralatan elektromekanis lambat dapat memproses byte sebelumnya (mis. Untuk mencetaknya).


Kemungkinan korupsi

Jika Anda mulai mendengarkan data serial di tengah aliran, sangat mungkin bahwa 0-bit di tengah aliran akan ditafsirkan sebagai bit awal, dan kemudian penerima akan menafsirkan semuanya setelah itu dengan tidak benar.

Satu-satunya cara nyata untuk pulih dari ini adalah memiliki celah yang cukup besar, dari waktu ke waktu, (mis. 10 bit panjang) sehingga ini tidak dapat terjadi.


Logika terbalik

Bit yang ditunjukkan di sini (level logika) tidak terbalik. Yaitu, 1-bit TINGGI dan 0-bit RENDAH. Jika Anda memiliki peralatan RS232 yang mungkin akan mengirim sesuatu seperti -12 V untuk 1-bit, dan +12 V untuk 0-bit. Ini terbalik karena yang kurang dari nol, tegangan-bijaksana.

Jika Anda memiliki perangkat tersebut, Anda perlu melakukan konversi tegangan dan inversi logika. Chip seperti MAX232 akan melakukan keduanya untuk Anda. Mereka juga dapat menyediakan -12 V yang diperlukan untuk menggerakkan peralatan tersebut dengan membuatnya secara internal dengan bantuan beberapa kapasitor yang disediakan pengguna.


Aturan praktis yang cepat

Karena, dengan satu bit awal, 8 bit data, dan bit satu stop, kami memiliki total 10 bit, sebagai aturan praktis, Anda dapat menghitung jumlah byte yang dapat Anda transmisikan dalam hitungan detik dengan membagi laju bit dengan 10 .

Misalnya. Di 9600 BPS Anda dapat mengirim 960 byte per detik.


Kode untuk direproduksi:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }
Nick Gammon
sumber
1

; TLDR; Ini menginisialisasi port komunikasi serial dan menetapkan laju baud. Perangkat yang berkomunikasi dengan Anda (atau Arduino IDE Serial Monitor) harus diatur ke baud rate yang sesuai. Setelah menginisialisasi port, Anda dapat mulai mengirim atau menerima karakter. Referensi Seri Arduino

linhartr22
sumber
Untuk tidak mengurangi atau tidak menghargai liputan @ Nick-Gammon yang sangat baik tentang topik ini.
linhartr22