Tautan Serial#
Perkenalan#
SerialLink memungkinkan dua EXP Brain berkomunikasi dengan mengirim dan menerima data serial mentah melalui VEX Link. Alih-alih pesan berlabel, SerialLink mengirimkan buffer (berupa string atau array byte). Hal ini membuatnya berguna untuk komunikasi robot-ke-robot tingkat lanjut, seperti streaming data sensor, mengirim format paket khusus, atau membangun protokol Anda sendiri di atas byte.
Setiap penggunaan send menambahkan data ke buffer penerima EXP Brain yang terhubung. Data dibaca sesuai urutan kedatangannya (masuk pertama, keluar pertama). Jika beberapa buffer dikirim sebelum EXP Brain lain menggunakan receive, buffer tersebut tetap mengantre dan dikembalikan satu per satu sesuai urutan pengirimannya. Karena data dapat mengantre, pengiriman buffer besar secara berulang setiap putaran dapat menyebabkan penumpukan; untuk tautan yang sensitif terhadap waktu, kirim hanya apa yang Anda butuhkan.
Penting: Kedua robot harus menjalankan proyek yang menggunakan SerialLink secara bersamaan, jika tidak, tidak ada data yang akan dikirim/diterima.
Halaman ini menggunakan link sebagai contoh SerialLink nama. Ganti dengan nama yang Anda konfigurasi sendiri sesuai kebutuhan.
Berikut adalah daftar metode yang tersedia:
is_linked– Mengembalikan apakah Otak ini terhubung secara aktif ke Otak pasangannya.send– Mengirim pesan singkat (dengan data int/float opsional) ke Brain yang dipasangkan.receive– Menunggu dan mengembalikan pesan masuk berikutnya.received– Mendaftarkan fungsi yang akan dipanggil setiap kali pesan baru diterima.
Buat Tautan#
Buat SerialLink pada kedua EXP Brain untuk membangun saluran komunikasi di antara keduanya—baik secara nirkabel dengan V5 Robot Radio atau melalui Smart Cable berkabel—sehingga robot dapat mengirim data serial mentah satu sama lain.
SerialLink(smartport, name, linktype, wired)
Parameter |
Keterangan |
|---|---|
|
Port Pintar yang digunakan untuk tautan ini—port tempat Radio Robot V5 terhubung (nirkabel) atau tempat Kabel Pintar dicolokkan (berkabel). Ditulis sebagai |
|
Nama unik yang akan diberikan pada tautan ini sebagai string. |
|
Peran yang akan digunakan Otak ini untuk pasangan tautan ini. Setiap pasangan harus mencakup satu Manajer dan satu Pekerja:
|
|
Opsional. Apakah tautan ini menggunakan kabel atau nirkabel:
|
Kode untuk Robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kode untuk Robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Metode yang Tersedia#
Setelah SerialLink Anda terpasang dan Brain terhubung, Anda dapat menggunakan metode di bawah ini untuk mengirim, menerima, dan menanggapi data serial mentah.
is_linked#
Metode is_linked mengembalikan nilai boolean yang menunjukkan apakah EXP Brain pada SerialLink sudah terpasang satu sama lain.
True– Kedua Otak EXP berpasangan dan berkomunikasi melalui tautan ini.False– Kedua Otak EXP tidak berpasangan pada tautan ini.
Catatan: Sebaiknya selalu periksa untuk memastikan EXP Brains sudah terhubung di awal proyek sebelum menjalankan kode lebih lanjut.
Usage:
link.is_linked()
Parameter |
Keterangan |
|---|---|
Metode ini tidak memiliki parameter. |
Kode untuk Robot 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Kode untuk Robot 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
send#
send mengirimkan byte serial mentah ke EXP Brain lain yang terhubung.
Saat membaca data tersebut dengan receive, receive hanya akan kembali setelah mengumpulkan jumlah byte yang ditentukan oleh parameter length -nya. Karena itu, jika kode Anda selalu memanggil receive dengan panjang tetap length, Anda harus memastikan setiap pesan yang dikirim dengan send persis memiliki jumlah byte tersebut (seringkali dengan padding) sehingga penerima tidak terblokir menunggu byte tambahan.
Jika Anda tidak ingin bergantung pada jumlah byte yang tepat, gunakan received sebagai gantinya; ini memungkinkan Anda untuk menangani byte apa pun yang tersedia tanpa memerlukan panjang tertentu.
Usage:
send(buffer)
Parameter |
Keterangan |
|---|---|
|
The data to send to the other linked EXP Brain. This can be a |
Kode untuk Robot 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Kode untuk Robot 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
receive#
receive mengembalikan data serial dari EXP Brain terkait lainnya dalam urutan FIFO (data terlama yang belum dibaca terlebih dahulu).
Karena receive menunggu jumlah byte yang tepat, pengiriman pesan dengan panjang tetap sering kali memerlukan padding saat menggunakan receive sehingga setiap pesan mencapai ukuran yang diharapkan. Jika pengirim mengirimkan kurang dari send byte, length akan terus menunggu byte yang tersisa dan tidak mengembalikan apa pun.
Jika antrean kosong dan Anda memberikan batas waktu timeout receive akan menunggu hingga sejumlah milidetik tersebut untuk data baru. Jika tidak ada data yang tiba dalam jangka waktu tersebut, maka akan mengembalikan None. Data apa pun yang dikirim setelahnya akan tetap berada dalam antrean untuk dibaca nanti.
Usage:
receive(length, timeout)
Parameter |
Keterangan |
|---|---|
|
Jumlah byte yang akan diterima. |
|
Opsional. Berapa lama dalam milidetik |
Kode untuk Robot 1
# Send a math problem for the other Brain to solve # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ packet = "add,7,2.5" # Pad with spaces until it's exactly 16 bytes while len(packet) < 16: packet = packet + " " link.send(packet)Kode untuk Robot 2
# Solve the math problem that the other Brain sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # Receive exactly 16 bytes buffer = link.receive(16) # Remove the added " " padding text = buffer.decode().strip() # Separate the operator and numbers parts = text.split(",") operator = parts[0] a = float(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If not "add" or "subtract", do nothing else: pass brain.screen.print("Result = ", result)
received#
received register yang mendaftarkan fungsi yang akan dipanggil setiap kali EXP Brain menerima data serial.
Usage:
link.received(callback)
Parameter |
Keterangan |
|---|---|
|
Sebuah fungsi yang telah didefinisikan sebelumnya yang dieksekusi ketika EXP Brain menerima data serial. |
received panggilan balik yang dipanggil dengan dua argumen:
Tanda Tangan Panggilan Balik:
callback(buffer, length)
Argumen |
Keterangan |
|---|---|
|
A |
|
Jumlah byte valid yang diterima dalam buffer |
Kode untuk Robot 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Kode untuk Robot 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)