Seri Bağlantı#
giriiş#
SerialLink, iki EXP Brain’in VEX Link üzerinden ham seri veri gönderip alarak iletişim kurmasını sağlar. SerialLink, etiketli mesajlar yerine bir tampon (bir dize veya bir bayt dizisi) iletir. Bu, sensör verilerinin akışı, özel paket formatlarının gönderilmesi veya baytlar üzerine kendi protokolünüzün oluşturulması gibi gelişmiş robotlar arası iletişim için kullanışlı hale getirir.
send’nin her kullanımı, bağlantılı EXP Beyninin alma tamponuna veri ekler. Veriler geliş sırasına göre okunur (ilk giren ilk çıkar). Diğer EXP Beyni receive’i kullanmadan önce birden fazla tampon gönderilirse, bunlar kuyruğa alınır ve gönderildikleri sıraya göre tek tek geri döndürülür. Veriler kuyruğa alınabildiğinden, her döngüde büyük tamponları tekrar tekrar göndermek birikmeye neden olabilir; zaman açısından kritik bağlantılar için yalnızca ihtiyacınız olanı gönderin.
Önemli: Her iki robot da aynı anda SerialLink kullanan projeleri çalıştırıyor olmalıdır, aksi takdirde veri gönderilemez/alınamaz.
Bu sayfada örnek olarak link ve SerialLink adı kullanılmıştır. Gerektiğinde kendi yapılandırdığınız adla değiştirin.
Aşağıda mevcut yöntemlerin listesi bulunmaktadır:
is_linked– Bu Beynin eşleştirilmiş Beyne aktif olarak bağlı olup olmadığını döndürür.send– Eşleştirilmiş Beyne kısa bir mesaj (isteğe bağlı tamsayı/ondalık sayı verileriyle) gönderir.receive– Bir sonraki gelen mesajı bekler ve geri döndürür.received– Yeni bir mesaj alındığında çağrılacak bir fonksiyonu kaydeder.
Bağlantı Oluştur#
Her iki EXP Brain üzerinde de SerialLink oluşturarak, robotlar birbirlerine ham seri veri gönderebilsinler diye, V5 Robot Radyoları ile kablosuz olarak veya kablolu Akıllı Kablo aracılığıyla aralarında bir iletişim kanalı kurun.
SerialLink(smartport, name, linktype, wired)
Parametre |
Tanım |
|---|---|
|
Bu bağlantı için kullanılan Akıllı Bağlantı Noktası; V5 Robot Radyosunun bağlı olduğu (kablosuz) veya Akıllı Kablonun takıldığı (kablolu) bağlantı noktasıdır. |
|
Bu bağlantıya verilecek benzersiz ad. |
|
Bu Beyin, bu bağlantı çifti için kullanacağı rolü belirtir. Her çiftte bir Yönetici ve bir İşçi bulunmalıdır:
|
|
İsteğe bağlı. Bu bağlantının kablolu mu yoksa kablosuz mu olduğu:
|
Robot 1 için Kod
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robot 2 için Kod
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Mevcut Yöntemler#
SerialLink’iniz kurulduktan ve Brain’ler birbirine bağlandıktan sonra, ham seri verileri göndermek, almak ve yanıtlamak için aşağıdaki yöntemleri kullanabilirsiniz.
is_linked#
is_linked yöntemi, SerialLink üzerindeki EXP Beyinlerinin birbiriyle eşleştirilip eşleştirilmediğini döndürür.
True– İki EXP Beyni eşleştirilmiş ve bu bağlantı üzerinden iletişim kuruyor.False– Bu bağlantıda iki EXP Beyni eşleştirilmemiş.
Not: Herhangi bir kod çalıştırmadan önce projenin başında EXP Brains’in bağlantılı olduğundan emin olmak her zaman iyi bir uygulamadır.
Usage:
link.is_linked()
Parametreler |
Tanım |
|---|---|
Bu yöntemin parametresi yoktur. |
Robot 1 için Kod
# 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")Robot 2 için Kod
# 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 , ham seri baytları diğer bağlantılı EXP Beynine iletir.
receive ile bu verileri okurken, receive yalnızca length parametresiyle belirtilen bayt sayısını topladıktan sonra geri döner. Bu nedenle, kodunuz her zaman receive sabit bir lengthile çağırıyorsa, send ile gönderilen her mesajın tam olarak o kadar bayt olduğundan (genellikle dolgu ile) emin olmalısınız, böylece alıcı ek baytlar için beklemede bloke olmaz.
Eğer kesin bayt sayısına bağlı kalmak istemiyorsanız, bunun yerine received kullanın; bu, belirli bir uzunluğa ihtiyaç duymadan mevcut baytları işlemenizi sağlar.
Usage:
send(buffer)
Parametreler |
Tanım |
|---|---|
|
Diğer bağlantılı EXP Beynine gönderilecek veriler. Bu, |
Robot 1 için Kod
# 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")Robot 2 için Kod
# 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 bağlantılı EXP Brain’den seri verileri FIFO sırasına göre (en eski okunmamış veri önce) alır ve döndürür.
Çünkü receive tam bayt sayısını bekler, sabit uzunluktaki mesajlaşma genellikle receive kullanılırken her mesajın beklenen boyuta ulaşması için dolgu gerektirir. Gönderici send bayttan daha az veri gönderirse, length kalan baytları beklemeye devam eder ve hiçbir şey döndürmez.
Kuyruk boşsa ve timeoutve receive yeni veri için o kadar milisaniyeye kadar bekler. Bu süre içinde hiçbir şey gelmezse, Nonedeğerini döndürür. Daha sonra gönderilen veriler daha sonra okunmak üzere kuyrukta kalır.
Usage:
receive(length, timeout)
Parametreler |
Tanım |
|---|---|
|
Alınacak bayt sayısı. |
|
İsteğe bağlı. Milisaniye cinsinden süre. |
Robot 1 için Kod
# 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)Robot 2 için Kod
# 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 kaydedildi; bu, EXP Brain seri veri aldığında çağrılacak bir fonksiyondur.
Usage:
link.received(callback)
Parametreler |
Tanım |
|---|---|
|
EXP Beyni seri veri aldığında yürütülen, önceden tanımlanmış bir fonksiyon. |
received geri çağırma işlemi iki argümanla çağrılıyor:
Geri Çağrı İmzası:
callback(buffer, length)
Argüman |
Tanım |
|---|---|
|
Alınan seri verileri içeren |
|
Bu geri çağırma için |
Robot 1 için Kod
# 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")Robot 2 için Kod
# 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)