Σύνδεσμος μηνύματος#
Εισαγωγή#
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 είναι συνδεδεμένοι στην αρχή ενός έργου πριν από την εκτέλεση οποιουδήποτε περαιτέρω κώδικα.
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. Τα διπλάσια μορφοποιούνται σε 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 );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Η προσωρινή μνήμη για την αποθήκευση του ληφθέντος μηνύματος. |
|
|
Το μήκος του buffer. |
|
|
How long in milliseconds |
Αυτή η συνάρτηση επιστρέφει τον αριθμό των byte που λαμβάνονται.
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
// Create the link. message_link link(PORT1, "LeftRightLink", linkType::manager, true); // 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(); // 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); } }