SerialLink#
Introducción#
SerialLink permite que dos cerebros EXP se comuniquen enviando y recibiendo datos en serie sin procesar a través de VEX Link. En lugar de mensajes etiquetados, SerialLink transmite un búfer (una cadena o una matriz de bytes). Esto lo hace útil para la comunicación avanzada de robot a robot, como la transmisión de datos de sensores, el envío de formatos de paquetes personalizados o la creación de su propio protocolo sobre bytes.
Cada uso de send agrega datos al búfer de recepción del cerebro EXP vinculado. Los datos se leen en el orden en que llegan (primero en entrar, primero en salir). Si se envían varios búferes antes de que el otro EXP Brain use receive, permanecen en cola y se devuelven uno a la vez en el orden en que se enviaron. Debido a que los datos pueden ponerse en cola, enviar repetidamente grandes búferes en cada bucle puede crear retraso; para enlaces críticos en el tiempo, envíe solo lo que necesite.
Importante: Ambos robots deben estar ejecutando proyectos que SerialLink SerialLink al mismo tiempo, o no se enviarán ni recibirán datos.
Esta página utiliza link como nombre de ejemplo de SerialLink. Reemplácelo con su propio nombre configurado según sea necesario.
A continuación se muestra una lista de los métodos disponibles:
is_linked– Devuelve si este cerebro está conectado activamente a su cerebro emparejado.send– Envía un mensaje corto (con datos int/float opcionales) al cerebro emparejado.receive– Espera y devuelve el siguiente mensaje entrante.received– Registra una función que se llamará cada vez que se reciba un nuevo mensaje.
Crear un enlace#
Cree un SerialLink en ambos EXP Brains para establecer un canal de comunicación entre ellos, ya sea de forma inalámbrica con V5 Robot Radios o a través de un cable inteligente cableado, para que los robots puedan enviarse datos en serie sin procesar.
SerialLink(smartport, name, linktype, wired)
Parámetro |
Descripción |
|---|---|
|
El puerto inteligente utilizado para este enlace: el puerto al que está conectado el radio robot V5 (inalámbrico) o el cable inteligente está conectado (cableado). Escrito como |
|
El nombre único para dar este enlace como una cadena. |
|
El rol que este cerebro usará para este par de enlaces. Cada par debe incluir un Gerente y un Trabajador
|
|
Opcional. Si este enlace es por cable o inalámbrico:
|
Código para Robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Código para Robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Métodos disponibles#
Una vez que su SerialLink esté configurado y los Brains estén vinculados, puede usar los métodos a continuación para enviar, recibir y responder a datos en serie sin procesar.
is_linked#
el método is_linked devuelve si los cerebros EXP en un SerialLink están emparejados entre sí.
True: los dos cerebros EXP están emparejados y se comunican en este enlace.False: los dos cerebros EXP no están emparejados en este enlace.
Nota: Es una buena práctica verificar siempre que los cerebros EXP estén vinculados al comienzo de un proyecto antes de ejecutar cualquier código adicional.
Usage:
link.is_linked()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
Código para 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")Código para 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 transmite bytes seriales sin procesar al otro cerebro EXP vinculado.
Al leer esos datos con receive, receive solo devolverá un valor una vez que haya recopilado la cantidad de bytes especificada por su receive parámetro. Debido a eso, si su código siempre llama a length con una lengthfija, debe asegurarse de que cada mensaje enviado con send tenga exactamente esa cantidad de bytes (a menudo mediante relleno) para que el receptor no se bloquee esperando bytes adicionales.
Si no desea depender de un recuento exacto de bytes, use received en su lugar; le permite manejar los bytes disponibles sin requerir una longitud específica.
Usage:
send(buffer)
Parámetros |
Descripción |
|---|---|
|
Los datos para enviar al otro cerebro EXP vinculado. Esto puede ser una |
Código para 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")Código para 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 devuelve datos en serie del otro cerebro EXP vinculado en orden FIFO (primero los datos más antiguos no leídos).
Debido a que receive espera un número exacto de bytes, la mensajería de longitud fija a menudo requiere relleno cuando se usa send para que cada mensaje alcance el tamaño esperado. Si el remitente transmite menos de length bytes, receive seguirá esperando los bytes restantes y no devolverá nada.
Si la cola está vacía y proporciona un timeout, receive espera hasta tantos milisegundos para obtener nuevos datos. Si no llega nada en esa ventana, devuelve None. Cualquier dato enviado después permanece en cola para ser leído más tarde.
Usage:
receive(length, timeout)
Parámetros |
Descripción |
|---|---|
|
El número de bytes a recibir. |
|
Opcional. Cuánto tiempo en milisegundos |
Código para 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)Código para 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 registra una función que se llamará cada vez que el cerebro EXP reciba datos en serie.
Usage:
link.received(callback)
Parámetros |
Descripción |
|---|---|
|
Una function previamente definida que se ejecuta cuando el EXP Brain recibe datos en serie. |
received devolución de llamada se llaman con dos argumentos:
Firma de devolución de llamada:
callback(buffer, length)
Argumento |
Descripción |
|---|---|
|
Una matriz |
|
El número de bytes válidos recibidos en el |
Código para 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")Código para 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)