Soros kapcsolat#
Bevezetés#
A SerialLink lehetővé teszi két V5 Brain kommunikációját nyers soros adatok VEX Linken keresztüli küldésével és fogadásával. A címkézett üzenetek helyett a SerialLink egy puffert (karakterláncot vagy bájtcsobcsot) 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 V5 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 V5 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 V5 Brain-en, hogy kommunikációs csatornát hozz létre közöttük – akár vezeték nélkül V5 Robot Radios-szal, 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 soros linken lévő V5 Brain-ek párosítva vannak-e egymással.
True– A két V5 agy párosítva van és ezen a kapcsolaton keresztül kommunikál.False– A két V5 Brain nincs párosítva ezen a kapcsolaton.
Megjegyzés: Jó gyakorlat, ha a projekt elején mindig ellenőrizzük, hogy a V5 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 V5 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 V5 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 soros adatokat ad vissza a másik összekapcsolt V5 Brain-ből FIFO sorrendben (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 minden alkalommal meghívódik, amikor a V5 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 a V5 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)