Meddelandelänk#
Introduktion#
MessageLink låter två EXP-hjärnor kommunicera genom att skicka korta strängmeddelanden med valfri liten data. Den är utformad för koordinering mellan robotar – som att starta rutiner, dela sensorresultat eller utlösa beteenden på en annan robot.
Varje gång man använder send läggs ett meddelande till i den länkade EXP Brain-kön, och kön läses först in, först ut (FIFO). Om flera meddelanden skickas innan den andra EXP Brain använder receive, kommer de att lagras och returneras ett i taget i den ordning de skickades. Eftersom meddelanden kan köa kan det skapa en eftersläpning om man upprepar sändningar av samma status i varje loop; för tidskritisk logik, skicka endast när värdena ändras.
Viktigt: Båda robotarna måste köra projekt som använder MessageLink samtidigt, annars kommer inga meddelanden att skickas/tas emot.
Den här sidan använder link som exempelnamn MessageLink Ersätt det med ditt eget konfigurerade namn efter behov.
Nedan följer en lista över tillgängliga metoder:
Skapa en länk#
Skapa en MessageLink på båda EXP-hjärnorna för att upprätta en kommunikationskanal mellan dem – antingen trådlöst med V5-robotradior eller via en trådbunden smart kabel – så att robotarna kan skicka meddelanden till varandra.
MessageLink(smartport, name, linktype, wired)
Parameter |
Beskrivning |
|---|---|
|
Smart Port som används för denna länk – porten som V5 Robot Radio är ansluten till (trådlös) eller Smart Cable är inkopplad i (kabelansluten). Skrivs som |
|
Det unika namnet som ska anges som en sträng för denna länk. |
|
Den roll som denna hjärna kommer att använda för detta länkpar. Varje par måste innehålla en chef och en arbetare:
|
|
Valfritt. Om den här länken är trådbunden eller trådlös:
|
Kod för robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kod för robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Tillgängliga metoder#
När din MessageLink är konfigurerad och hjärnorna är länkade kan du använda metoderna nedan för att skicka, ta emot och svara på meddelanden.
is_linked#
is_linked -metoden returnerar om EXP-hjärnorna på en MessageLink är parade med varandra.
True– De två EXP-hjärnorna är parade ihop och kommunicerar på den här länken.False– De två EXP-hjärnorna är inte parade ihop på den här länken.
Obs: Det är god praxis att alltid kontrollera att EXP-hjärnorna är länkade i början av ett projekt innan du kör ytterligare kod.
Usage:
link.is_linked()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
Kod för robot 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(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") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod för robot 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
send#
send skickar en sträng och/eller ett heltal och/eller flyttal till den andra länkade EXP-hjärnan.
Usage:
send(string, integer, float)
Parametrar |
Beskrivning |
|---|---|
|
Strängen som ska skickas till den andra länkade EXP-hjärnan. |
|
Valfritt. Ett heltal att skicka till den andra länkade EXP-hjärnan. |
|
Valfritt. Ett flyttal att skicka till den andra länkade EXP Brain. Flyttalen formateras till 4 decimaler; om färre decimaler anges läggs efterföljande nollor tills 4 visas. |
Om endast string skickas, tar den andra länkade EXP-hjärnan emot exakt den strängen.
Om integer och/eller float inkluderas, får den mottagande hjärnan en enda kodad sträng som kombinerar alla fält i denna ordning: .string_integer_float
Exempel: Med link.send(“string”, 1, 2.55) emot som .string_1_2.5500.
Kod för robot 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(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") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod för robot 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Kod för robot 1
# Tell the other robot where the screen was pressed # Create the link link = MessageLink(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") brain.screen.next_row() brain.screen.print("Tap to send circles") # Send the coordinates whenever the screen is pressed while True: if brain.screen.pressing(): x = brain.screen.x_position() y = brain.screen.y_position() link.send("touch", x, y) wait(10, MSEC)Kod för robot 2
# Draw a circle where Robot 1's screen was pressed # Create the link link = MessageLink(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") while True: # Get the full encoded string circle_coordinates = link.receive(200) if circle_coordinates: # Split the encoded string by _ parts = circle_coordinates.split("_") if len(parts) == 3: # Convert the coordinates back into numbers x = float(parts[1]) y = float(parts[2]) brain.screen.set_fill_color(Color.WHITE) brain.screen.draw_circle(x, y, 20) wait(10, MSEC)
receive#
receive returnerar nästa meddelande i kö från den andra länkade EXP Brain. Meddelanden läses i FIFO-ordning (äldsta olästa först). Om kön är tom när receive anropas, väntar den upp till den angivna timeout på ett nytt meddelande. Om inget meddelande anländer i det fönstret, returnerar receive None, och alla meddelanden som skickas efteråt finns kvar i kön för att läsas nästa gång receive används.
Om den andra länkade EXP-hjärnan bara skickade en string, receive exakt den strängen.
Om den andra länkade EXP Brain skickade ett heltal och/eller flyttal, returnerar receive en enda kodad sträng som kombinerar alla fält i denna ordning: .string_integer_float
Om till exempel den andra länkade EXP Brain använder link.send(“string”, 1, 2.55), returnerar link.receive() en kodad sträng som .string_1_2.5500. Du kan dela denna kodade sträng (se exemplen nedan) för att extrahera meddelandenamnet, heltal och flyttal.
Om du hellre vill undvika manuell delning/parsning, använd received för att registrera en hanterare för ett specifikt meddelandenamn; hanteraren tar emot de skickade värdena som argument.
Usage:
receive(timeout)
Parametrar |
Beskrivning |
|---|---|
|
Valfritt. Hur länge i millisekunder |
Kod för robot 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(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") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod för robot 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Kod för robot 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(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. """ link.send("add", 7, 2.5)Kod för robot 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(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() math_problem = link.receive() if math_problem: # Split the encoded string by _ parts = math_problem.split("_") if len(parts) == 3: # Remove the . from the beginning of the string operator = "".join([c for c in parts[0] if c.isalpha()]) # Separate out the numbers for the operation a = int(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If neither add or subtract is sent, do nothing else: pass brain.screen.print("Result = ", result)
received#
received registrerar en funktion som ska anropas när EXP-hjärnan tar emot ett skickat meddelande.
Usage:
link.received(message, arg)
Parametrar |
Beskrivning |
|---|---|
|
The message name (string) to match. When a received message’s name matches this value, the |
|
En tidigare definierad funktion som körs när EXP-hjärnan tar emot ett meddelande som matchar |
received återanrop anropas med fyra argument:
Återuppringningssignatur:
callback(message, linkname, index, value)
Argument |
Beskrivning |
|---|---|
|
Meddelandenamnet som mottogs (till exempel |
|
Länknamnet som meddelandet mottogs från. |
|
Heltalsvärdet som skickas med meddelandet (om det anges). |
|
Flyttalsvärdet som skickas med meddelandet (om det anges). |
Kod för robot 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(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. """ link.send("add", 7, 2.5)Kod för robot 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # add if "add" is received def add_cmd(message, linkname, a, b): result = a + b brain.screen.print("Result = ", result) # subtract if ""subtract" is received def subtract_cmd(message, linkname, a, b): result = a - b brain.screen.print("Result = ", result) # Create event handlers for "add" and "subtract" link.received("add", add_cmd) link.received("subtract", subtract_cmd)