• VEXcode Robotics Logo VEX Robotics Logo
  • VEX API Home Button VEX API Home Button
  • VEX 123 logo in purple VEX 123 logo in white
  • VEX GO logo in lime green VEX GO logo in white
  • VEXcode AIM logo in blue VEXcode AIM logo in white
  • VEX IQ logo in blue VEX IQ logo in white
  • VEX EXP logo in red VEX EXP logo in white
  • VEX V5 logo in red VEX V5 logo in white
  • VEX CTE logo in green VEX CTE logo in white
  • VEX AIR logo in orange VEX AIR logo in white
  • VEXcode VR logo in gold VEXcode VR logo in white
Перейти к основному содержимому
Ctrl+K

< Back to Platform Select

  • VEX EXP
  • Справочник API VEX EXP
  • VEXlink
  • Ссылка на сообщение
Русский
  • English
  • العربية
  • বাংলা
  • Česky
  • Deutsch
  • Ελληνικά
  • Español
  • Español Latinoamericano
  • Suomi
  • Français
  • Gaeilge
  • हिंदी
  • Magyar
  • Bahasa Indonesia
  • 日本語
  • 한국어
  • Lietuvių
  • Latviešu
  • മലയാളം
  • Nederlands
  • Polski
  • Português
  • Svenska
  • ไทย
  • Türkçe
  • Українська
  • Tiếng Việt
  • 简体中文
  • 繁體中文
  • VEXcode Robotics Logo

Навигация по разделам

  • Блоки
  • Python
  • C++
    • Трансмиссия
    • Двигатели и контроллеры двигателей
    • 3-проводные устройства
    • Мозг
    • Консоль
    • Контроллер
    • Логика
    • Устройства Smart Port
    • VEXlink
      • Ссылка на сообщение
      • Последовательное соединение
    • Рабочая ячейка CTE
  • Уроки по VEXcode

Навигация по платформе

  • VEX 123 logo in purple VEX 123 logo in white
  • VEX GO logo in lime green VEX GO logo in white
  • VEXcode AIM logo in blue VEXcode AIM logo in white
  • VEX IQ logo in blue VEX IQ logo in white
  • VEX EXP logo in red VEX EXP logo in white
  • VEX V5 logo in red VEX V5 logo in white
  • VEX CTE logo in green VEX CTE logo in white
  • VEX AIR logo in orange VEX AIR logo in white
  • VEXcode VR logo in gold VEXcode VR logo in white

Ссылка на сообщение#

  • Введение

  • Конструкторы классов

  • Деструктор класса

  • Параметры

  • Пример

  • Функции участников

    • isLinked

    • отправлять

    • получать

    • полученный

Введение#

Класс message_link позволяет двум модулям EXP Brain обмениваться данными, отправляя короткие строковые сообщения с дополнительными небольшими данными. Он предназначен для координации действий между роботами — например, для запуска процедур, обмена результатами датчиков или запуска действий на другом роботе.

Каждое использование send добавляет сообщение в очередь связанного EXP Brain, и очередь читается по принципу «первым пришел — первым вышел» (FIFO). Если несколько сообщений отправлены до того, как другой EXP Brain использует receive, они будут сохраняться и возвращаться по одному в порядке их отправки. Поскольку сообщения могут стоять в очереди, многократная отправка одного и того же статуса в каждом цикле может создавать задержку; для критически важных по времени логических операций отправляйте сообщения только тогда, когда значения изменяются.

Важно: Оба робота должны одновременно запускать проекты, использующие message_link , иначе сообщения отправляться/получаться не будут.

Конструкторы классов#

message_link( 
  int32_t     index, 
  const char  *name, 
  linkType    type, 
  bool        isWired = false );

Деструктор класса#

Уничтожает объект message_link message_link и освобождает связанные с ним ресурсы.

virtual ~message_link();

Параметры#

Параметр

Тип

Описание

index

int32_t

Номер интеллектуального порта, к которому подключена радиостанция V5 или интеллектуальный кабель, обозначается как PORTx, где x — номер порта (например, PORT1).

name

char

Название ссылки на сообщение.

type

linkType

Тип связи: либо linkType::manager , либо linkType::workerЭта информация используется для правильной настройки радиосвязи, а также определяет доступную полосу пропускания для передачи и приема. Робот-менеджер имеет вдвое большую доступную полосу пропускания (1040 байт/секунду) для отправки информации роботу-рабочему (520 байт/секунду).

  • linkType::manager - Объект message_link является менеджером.
  • linkType::worker - Объект message_link является рабочим.

isWired

bool

Является ли объект message_link проводным.

  • true - Объект message_link проводной.
  • false - Объект message_link беспроводной.

Пример#

Код для робота 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

Функции участников#

Класс message_link включает следующие функции-члены:

  • isLinked — Возвращает значение, указывающее, активно ли этот мозг связан с парным мозгом.

  • send — Отправляет сообщение в парный мозг.

  • receive — Ожидает и возвращает следующее входящее сообщение.

  • received — Регистрирует функцию, которая будет вызываться при получении нового сообщения.

Перед вызовом любой из функций-членов message_link message_link необходимо создать экземпляр message_link message_link , как показано ниже:

Код для робота 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 возвращает значение, указывающее, связаны ли элементы EXP Brains в объекте MessageLink друг с другом.

Available Functions
bool isLinked();

Parameters

Эта функция не имеет параметров.

Return Values

Эта функция возвращает логическое значение.

  • true – Два мозга EXP объединены в пару и обмениваются данными по этой связи.

  • false – Два мозга EXP не связаны между собой по этой ссылке.

Notes

Перед запуском любого дальнейшего кода рекомендуется всегда проверять правильность подключения модулей EXP 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 Functions

1 — Отправляет строку сообщения.

int32_t send( 
  const char *message );

2 — Отправляет строку сообщения, содержащую double.

int32_t send( 
  const char *message, 
  double      value );

3 — Отправляет строку сообщения, содержащую int32_t и double.

int32_t send(
  const char *message, 
  int32_t     index, 
  double      value );

Parameters

Параметр

Тип

Описание

message

const char*

Сообщение, которое нужно отправить другому связанному EXP Brain.

index

int32_t

Целочисленное значение для отправки другому связанному EXP Brain.

value

double

Число типа double для отправки на другой связанный модуль EXP Brain. Число типа double форматируется до 4 знаков после запятой; если указано меньше десятичных знаков, добавляются нули в конце, пока не отобразится 4 знака после запятой.

Return Values

Эта функция не возвращает никаких значений.

Notes

Если отправлено только message , то другой связанный EXP Brain получит именно это сообщение.

Если включены значения value (и индекс index если он указан), принимающий Brain получает единое закодированное сообщение, объединяющее все поля в следующем порядке: .message_index_value

Examples

При использовании link.send(“string”, 1, 2.55) как .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 Functions
int32_t receive(
  char     *buffer,
  int32_t   length, 
  int32_t   timeoutMs = 500 );

Parameters

Параметр

Тип

Описание

buffer

char

Буфер для хранения полученного сообщения.

length

int32_t

Длина буфера.

timeoutMs

int32_t

Время ожидания в миллисекундах receive ожидание нового сообщения только в том случае, если очередь пуста. Значение по умолчанию — 300 000 (300 секунд).

Return Values

Эта функция возвращает количество полученных байтов.

Notes
  • receive возвращает следующее сообщение из очереди от другого связанного модуля EXP Brain. Сообщения читаются в порядке FIFO (самое старое непрочитанное первым). Если очередь пуста при вызове receive , она ожидает нового сообщения до истечения указанного receive . Если в течение этого времени сообщение не поступает, timeout возвращает 0, и любое сообщение, отправленное после этого, остается в очереди для чтения при следующем использовании функции receive.

  • Если другой связанный EXP Brain отправил только строку string, receive вернут именно эту строку.

  • Если другой связанный EXP Brain отправил целое число и/или число с плавающей запятой, receive , и возвращается одна закодированная строка, объединяющая все поля в следующем порядке: .string_integer_float

    • Например, если другой связанный EXP Brain использует link.send(“string”, 1, 2.55), то использование link.receive() возвращает закодированную строку, например .string_1_2.5500. Вы можете разделить эту закодированную строку (см. примеры ниже), чтобы извлечь имя сообщения, целочисленные и дробные значения.

    • Если вы предпочитаете избегать ручного разделения/анализа, используйте received, чтобы зарегистрировать обработчик для конкретного имени сообщения; обработчик получает отправленные значения в качестве аргументов.

Examples

При использовании link.send(“string”, 1, 2.55) как .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#

Регистрирует функцию, которая будет вызываться всякий раз, когда EXP Brain получает отправленное сообщение.

Available Functions

1 Регистрирует функцию обратного вызова для всех полученных сообщений (сообщение + значение).

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)
);

Parameters

Параметр

Тип

Описание

message

const char *

Имя сообщения, которое нужно отслеживать. Если оно опущено, функция обратного вызова будет выполняться для всех полученных сообщений.

callback

Указатель на функцию

Функция, которая выполняется при получении сообщения.

Return Values

Эта функция не возвращает никаких значений.

Callback Signature

1 Получает имя отправителя, имя сообщения и значение.

void callback(const char *, const char *, double)

2 Получает имя отправителя, имя сообщения, индекс и значение.

void callback(const char *, const char *, int32_t, double)

Тип

Описание

1st const char *

Название ссылки отправителя.

2nd const char *

Получено имя сообщения.

int32_t

Индекс, связанный с сообщением.

double

Значение, связанное с сообщением.

Examples

Код для робота 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);
  }
}

назад

VEXlink

вперёд

Последовательное соединение

На этой странице
  • Введение
  • Конструкторы классов
  • Деструктор класса
  • Параметры
  • Пример
  • Функции участников
    • isLinked
    • send
    • receive
    • received
Innovation First, International
​

VEX и VEX Robotics являются товарными знаками или знаками обслуживания компании Innovation First, Inc. Авторское право ©2026Все права защищены. VEX Robotics, Inc. является дочерней компанией Innovation First International, Inc. Все остальные названия продуктов/товарные знаки других компаний являются собственностью их соответствующих владельцев. Патенты и/или заявки на патенты - innovationfirst.com/patents
Политика конфиденциальности сайта / Условия использования сайта / Политика использования файлов cookie / Политика конфиденциальности программного обеспечения

Посетите страницу VEX Robotics в Facebook. Посетите страницу VEX Robotics в Твиттере. Посетите страницу VEX Robotics в Instagram. Посетите страницу VEX Robotics на YouTube.
Форма обратной связи VEX API

Мы ценим ваши отзывы! Используйте эту форму, чтобы поделиться предложениями, похвалами или сообщить об ошибках в работе VEX API. Ваши отзывы помогают нам улучшать документацию по VEX API.

​

Если у вас возникли технические проблемы или вам требуется поддержка клиентов, пожалуйста, посетите сайт support.vex.com.

  • Send Happy Feedback
  • Send Sad Feedback

Примечание: текущий URL-адрес будет добавлен к вашему сообщению.

Указав свой адрес электронной почты, вы соглашаетесь с тем, что VEX может отправлять вам электронные письма, если у нас возникнут вопросы по поводу ваших отзывов.
Политика конфиденциальности >
Пожалуйста, оставьте свой отзыв. Отзыв успешно отправлен!
Choose Which VEX IQ Generation to View

VEX IQ (1st gen)

VEX IQ (2nd gen)