Soros kapcsolat#
Bevezetés#
A SerialLink lehetővé teszi két EXP Brain közötti kommunikációt nyers soros adatok küldésével és fogadásával a VEX Linken keresztül. A címkézett üzenetek helyett a SerialLink egy puffert (egy karakterláncot vagy egy bájtcsobányi tömböt) továbbít. Ez hasznossá teszi a fejlett robot-robot kommunikációhoz, például érzékelőadatok streameléséhez, egyéni csomagformátumok küldéséhez vagy saját protokoll bájtokra építéséhez.
A send minden egyes használata adatokat ad hozzá a csatolt EXP Brain fogadó pufferéhez. Az adatok beolvasása érkezési sorrendben történik (elsőként be, elsőként ki). Ha több puffer is elküldésre kerül, mielőtt a másik EXP Brain a receive utasítást használja, azok sorban maradnak, és egyenként, a küldés sorrendjében kerülnek visszaadásra. Mivel az adatok sorban állhatnak, a nagy pufferek ismételt küldése minden ciklusban várakozást okozhat; időkritikus kapcsolatok esetén csak azt küldje el, amire szüksége van.
Fontos: Mindkét robotnak egyszerre kell olyan projekteket futtatnia, amelyek SerialLink használnak, különben nem történik adatküldés/fogadás.
Ez az oldal link nevet használja példaként SerialLink névhez. Szükség szerint cserélje ki a saját konfigurált névre.
Az alábbiakban felsoroljuk az elérhető módszereket:
is_linked– Visszaadja, hogy ez az Agy aktívan csatlakozik-e a párosított Agyhoz.send– Rövid üzenetet küld (opcionális int/float adatokkal) a párosított Brainnek.receive– Várakozás a következő bejövő üzenetre, majd visszaküldi azt.received– Regisztrál egy függvényt, amely minden új üzenet érkezésekor meghívódik.
Link létrehozása#
Hozz létre egy soros kapcsolatot mindkét EXP Brain-en, hogy kommunikációs csatornát hozz létre közöttük – akár vezeték nélkül a V5 Robot Radios segítségével, akár vezetékes Smart Cable-en keresztül –, így a robotok nyers soros adatokat küldhetnek egymásnak.
SerialLink(smartport, name, linktype, wired)
Paraméter |
Leírás |
|---|---|
|
Az ehhez a kapcsolathoz használt Smart Port – az a port, amelyhez a V5 Robot Radio csatlakozik (vezeték nélküli), vagy amelyhez a Smart Cable csatlakozik (vezetékes). |
|
A link egyedi neve karakterláncként. |
|
Az Agy szerepe, amelyet ez a kapcsolatpárhoz fog használni. Minden párnak tartalmaznia kell egy Menedzsert és egy Munkást:
|
|
Opcionális. Vezetékes vagy vezeték nélküli kapcsolatról van szó:
|
1. robot kódja
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robot 2 kódja
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Elérhető módszerek#
Miután a SerialLink beállítása és a Brains összekapcsolása megtörtént, az alábbi módszerek segítségével küldhet, fogadhat és válaszolhat nyers soros adatokra.
is_linked#
is_linked A metódus visszaadja, hogy a SerialLinken lévő EXP Brain-ek párosítva vannak-e egymással.
True– A két EXP agy párosítva van és ezen a kapcsolaton keresztül kommunikál.False– A két EXP Brain nincs párosítva ezen a linken.
Megjegyzés: Jó gyakorlat, ha a projekt elején mindig ellenőrizzük, hogy az EXP Brain-ek össze vannak-e kapcsolva, mielőtt bármilyen további kódot futtatnánk.
Usage:
link.is_linked()
Paraméterek |
Leírás |
|---|---|
Ennek a metódusnak nincsenek paraméterei. |
1. robot kódja
# 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 kódja
# 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 nyers soros bájtokat küld a másik összekapcsolt EXP Brainnek.
When reading that data with receive, receive will only return once it has collected the number of bytes specified by its length parameter. Because of that, if your code always calls receive with a fixed length, you should ensure each message sent with send is exactly that many bytes (often by padding) so the receiver doesn’t block waiting for additional bytes.
Ha nem szeretnél pontos bájtszámtól függeni, használd a received függvényt; ez lehetővé teszi, hogy a rendelkezésre álló bájtokat kezeld anélkül, hogy egy adott hosszt kellene megadnod.
Usage:
send(buffer)
Paraméterek |
Leírás |
|---|---|
|
A másik összekapcsolt EXP Brain-nek küldendő adatok. Ez lehet egy |
1. robot kódja
# 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 kódja
# 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 FIFO sorrendben adja vissza a másik összekapcsolt EXP Brain soros adatait (a legrégebbi olvasatlan adattal kezdődően).
Mivel receive pontos bájtszámra vár, a fix hosszúságú üzenetküldés gyakran kitöltést igényel send használatakor, hogy minden üzenet elérje a várt méretet. Ha a küldő kevesebb, mint length bájtot küld, receive továbbra is a fennmaradó bájtokra vár, és nem ad vissza semmit.
Ha a várólista üres és timeout, receive függvény ennyi milliszekundumot vár az új adatokra. Ha az adott ablakban semmi sem érkezik, akkor Noneértéket ad vissza. A később küldött adatok a sorban maradnak, hogy később beolvassák őket.
Usage:
receive(length, timeout)
Paraméterek |
Leírás |
|---|---|
|
A fogadandó bájtok száma. |
|
Opcionális. Mennyi ideig várjon |
1. robot kódja
# 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 kódja
# 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 regisztrál egy függvényt, amely akkor hívódik meg, amikor az EXP Brain soros adatokat fogad.
Usage:
link.received(callback)
Paraméterek |
Leírás |
|---|---|
|
Egy korábban definiált függvény, amely akkor hajtódik végre, amikor az EXP Brain soros adatokat fogad. |
received visszahívásokat két argumentummal hívjuk meg:
Visszahívási aláírás:
callback(buffer, length)
Érv |
Leírás |
|---|---|
|
Egy |
|
Az érvényes bájtok száma, amelyeket az |
1. robot kódja
# 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 kódja
# 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)