消息链接#
介绍#
The message_link class lets two V5 Brains communicate by sending short string messages with optional small data. It’s designed for robot-to-robot coordination — like starting routines, sharing sensor results, or triggering behaviors on another robot.
Every usage of send adds a message to the linked V5 Brain’s queue, and the queue is read first-in, first-out (FIFO). If multiple messages are sent before the other V5 Brain uses receive, they will be stored and returned one at a time in the order they were sent. Because messages can queue, repeatedly sending the same status every loop may create backlog; for time-critical logic, send only when values change.
Important: Both robots must be running projects that use message_link at the same time, or no messages will be sent/received.
类构造函数#
message_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
类析构函数#
Destroys the message_link object and releases associated resources.
virtual ~message_link();
参数#
范围 |
类型 |
描述 |
|---|---|---|
|
|
The Smart Port that the V5 Radio, or the Smart Cable, is connected to, written as |
|
|
消息链接的名称。 |
|
|
The type of link, either
|
|
|
Whether the message_link object is wired.
|
例子#
机器人 1 的代码
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWired机器人2的代码
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
成员功能#
The message_link class includes the following member functions:
isLinked— Returns whether this Brain is actively connected to its paired Brain.send— Sends a message to the paired Brain.receive— Waits for and returns the next incoming message.received— Registers a function to be called whenever a new message is received.
Before calling any message_link member functions, a message_link instance must be created, as shown below:
机器人 1 的代码
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWired机器人2的代码
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
isLinked method returns whether the V5 Brains on a MessageLink are paired with one another.
bool isLinked();
此函数没有任何参数。
Return Values此函数返回一个布尔值。
true– The two V5 Brains are paired and communicating on this link.false– The two V5 Brains are not paired on this link.
在项目开始时,运行任何其他代码之前,最好始终检查以确保 V5 Brains 已连接。
Examples机器人 1 的代码
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }机器人2的代码
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
send#
通过链路连接发送消息。
Available FunctionsParameters1 — 发送消息字符串。
int32_t send( const char *message );2 — Sends a message string with a
double.int32_t send( const char *message, double value );3 — Sends a message string with an
int32_tand adouble.int32_t send( const char *message, int32_t index, double value );
范围 |
类型 |
描述 |
|---|---|---|
|
|
要发送给另一个已连接的 V5 大脑的消息。 |
|
|
要发送给另一个已连接的 V5 大脑的整数。 |
|
|
发送给另一个已连接的 V5 Brain 的双精度浮点数。双精度浮点数默认显示 4 位小数;如果提供的位数少于 4 位,则会在末尾添加零,直到显示 4 位小数为止。 |
此函数不返回任何值。
NotesIf only message is sent, the other linked V5 Brain receives that exact message.
If value (and index if provided) are included, the receiving Brain gets a single encoded message that combines all fields in this order: .message_index_value
Using link.send(“string”, 1, 2.55) is received as .string_1_2.5500.
机器人 1 的代码
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }机器人2的代码
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
receive#
接收来自链路连接的消息。
Available Functionsint32_t receive(
char *buffer,
int32_t length,
int32_t timeoutMs = 500 );
范围 |
类型 |
描述 |
|---|---|---|
|
|
用于存储接收到的消息的缓冲区。 |
|
|
缓冲区长度。 |
|
|
How long in milliseconds |
此函数返回接收到的字节数。
Notesreceivereturns the next queued message from the other linked V5 Brain. Messages are read in FIFO order (oldest unread first). If the queue is empty whenreceiveis called, it waits up to the specifiedtimeoutfor a new message. If no message arrives in that window,receivereturns0, and any message sent afterward remains in the queue to be read the next timereceiveis used.If the other linked V5 Brain sent only a
string,receivereturns that exact string.If the other linked V5 Brain sent an integer and/or float,
receivereturns a single encoded string that combines all fields in this order:.string_integer_floatFor example, if the other linked V5 Brain uses
link.send(“string”, 1, 2.55), then usinglink.receive()returns an encoded string such as.string_1_2.5500. You can split this encoded string (see the examples below) to extract the message name, integer, and float values.If you’d rather avoid manual splitting/parsing, use
receivedto register a handler for a specific message name; the handler receives the sent values as arguments.
Using link.send(“string”, 1, 2.55) is received as .string_1_2.5500.
机器人 1 的代码
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }机器人2的代码
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
received#
注册一个函数,当 V5 大脑收到发送的消息时,该函数将被调用。
Available FunctionsParameters1 为所有收到的消息(消息 + 值)注册回调函数。
void received( void (* callback)(const char *, const char *, double) );2 为所有收到的消息注册一个回调函数(消息 + 索引 + 值)。
void received( void (* callback)(const char *, const char *, int32_t, double) );3 为特定消息(消息 + 值)注册回调。
void received( const char *message, void (* callback)(const char *, const char *, double) );4 为特定消息注册回调(消息 + 索引 + 值)。
void received( const char *message, void (* callback)(const char *, const char *, int32_t, double) );
范围 |
类型 |
描述 |
|---|---|---|
|
|
要监听的消息名称。如果省略,则回调函数将对所有接收到的消息运行。 |
|
函数指针 |
收到消息时执行的函数。 |
此函数不返回任何值。
Callback Signature1 接收发件人姓名、消息名称和值。
void callback(const char *, const char *, double)2 接收发件人姓名、消息名称、索引和值。
void callback(const char *, const char *, int32_t, double)
类型 |
描述 |
|---|---|
1st |
发件人链接名称。 |
2nd |
收到的消息名称。 |
|
与该消息关联的索引。 |
|
与消息关联的值。 |
机器人 1 的代码
// Send whether screen is pressed on left or right void screen_pressed() { if (Brain.Screen.xPosition() < 240) { link.send("left"); } else { link.send("right"); } } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create the link message_link link(PORT1, "LeftRightLink", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.print("Robot 1 - Manager"); Brain.Screen.pressed(screen_pressed); while (true) { wait(10, msec); } }机器人2的代码
// Create variable to track where screen is pressed int lastPress = 0; // Update the variable whenever a new message is received void message_received(const char* message, const char* linkname, double timestamp) { if (strcmp(message, "left") == 0) lastPress = 1; if (strcmp(message, "right") == 0) lastPress = 2; } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create the link message_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()) { wait(0.1, seconds); } link.received(message_received); // Display if Robot 1's screen was pressed on the left or right while (true) { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); if (lastPress == 1) { Brain.Screen.print("Manager pressed LEFT"); } else if (lastPress == 2) { Brain.Screen.print("Manager pressed RIGHT"); } else { Brain.Screen.print("Waiting..."); } wait(0.1, seconds); } }