• 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

    • отправлять

    • получать

    • полученный

Введение#

Класс serial_link serial_link позволяет передавать поток необработанных байтов между роботами. Он предназначен для связи между роботами, где и передающий, и принимающий роботы понимают содержимое потока данных.

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

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

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

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

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

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

~serial_link();

Параметры#

Параметр

Тип

Описание

index

int32_t

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

name

const char*

Название этой ссылки. Рекомендуется, чтобы эта уникальная строка была достаточно длинной, чтобы при хешировании с помощью Vexos был создан уникальный идентификатор. Плохим названием ссылки будет что-то общее, например, «vexlink», поскольку оно может быть использовано другой командой.

type

linkType

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

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

isWired

bool

Является ли объект serial_link проводным (по умолчанию false):

  • true — Объект serial_link проводной
  • false — Объект serial_link беспроводной

Примечания#

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

  • Для беспроводной связи каждому роботу необходим радиомодуль V5 Robot Radio, подключенный к интеллектуальному порту.

  • Радиомодуль VEXlink можно использовать совместно с радиомодулем VEXnet контроллера EXP, который следует подключать к интеллектуальному порту с самым высоким номером во избежание конфликтов.

  • Для создания VEXlink оба блока EXP Brain должны быть подключены к роботизированной радиосистеме V5.

Пример#

Код для робота 1

// Create a wireless link in Port 1
serial_link link = serial_link(
  PORT1, // index
  "VEXRoboticsLink123456789", // name
  linkType::manager, // type
  true); // isWired

Код для робота 2

// Create a wireless link in Port 1
serial_link link = serial_link(
  PORT1, // index
  "VEXRoboticsLink123456789", // name
  linkType::worker, // type
  true); // isWired

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

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

  • isLinked — Проверяет, связаны ли EXP Brains парой и обмениваются ли данными по этой связи.

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

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

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

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

Код для робота 1

// Create a wireless link in Port 1
serial_link link = serial_link(
  PORT1, // index
  "VEXRoboticsLink123456789", // name
  linkType::manager, // type
  true); // isWired

Код для робота 2

// Create a wireless link in Port 1
serial_link link = serial_link(
  PORT1, // index
  "VEXRoboticsLink123456789", // name
  linkType::worker, // type
  true); // isWired

isLinked#

Возвращает значение, указывающее, сопряжены ли модули EXP Brains, подключенные по последовательному каналу связи, друг с другом.

Available Functions
bool isLinked();

Parameters

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

Return Values

Возвращает логическое значение, указывающее, связаны ли EXP-мозги:

  • true — The two EXP Brains are paired and communicating on this link.
  • false — The two EXP Brains are not paired on this link.
Notes
  • Перед запуском любого дальнейшего кода рекомендуется всегда проверять правильность подключения модулей EXP Brains в начале проекта.

Examples

Код для робота 1

// Create the link
  serial_link 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");
  Brain.Screen.newLine();
  Brain.Screen.print("Sending message...");

  // Message to send
  const char* message = "Hello Robot 2";

  // Send the message
  link.send((uint8_t*)message, strlen(message));

Код для робота 2

// Create the link
  serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true);

  // Do not run code UNTIL the Brains are linked
  while (!link.isLinked()) {
    wait(0.1, seconds);
  }
  
  Brain.Screen.print("Robot 2 - Worker");
  Brain.Screen.newLine();
  Brain.Screen.print("Waiting...");

  // Buffer to store incoming bytes
  uint8_t buffer[32] = {0};

  int32_t n = link.receive(buffer, sizeof(buffer) - 1);

  // Null-terminate
  if (n > 0) {
    buffer[n] = 0;

    // Display the message that was sent
    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);
    Brain.Screen.print("Robot 2 - Worker");
    Brain.Screen.newLine();
    Brain.Screen.print((char*)buffer);
  }
  else {
    Brain.Screen.newLine();
    Brain.Screen.print("No message received");
  }

send#

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

Available Functions

1 — Отправляет сообщение, используя буфер байтов.

int32_t send( 
  uint8_t *buffer, 
  int32_t  length );

2 — Отправляет сообщение, используя буфер символов.

int32_t send( 
  const char *buffer, 
  int32_t     length );

Parameters

Параметр

Тип

Описание

buffer

uint8_t* or const char*

Буфер для отправки на другой связанный модуль EXP Brain.

length

int32_t

Длина буфера для отправки.

Return Values

Возвращает значение int32_t , представляющее количество отправленных байтов.

Examples

Код для робота 1

// Create the link
  serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true);

  // Do not run code UNTIL the Brains are linked
  while (!link.isLinked()) {
    wait(0.1, seconds);
  }

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Robot 1 - Manager");

  // Track last sent state
  uint8_t lastState = 255;  // impossible initial value

 // Tell Robot 2 when the screen is being pressed
  while (true) {
    uint8_t state = Brain.Screen.pressing() ? 1 : 0;

    // Only send if state changed
    if (state != lastState) {
      link.send(&state, 1);
      lastState = state;
    }

    wait(0.02, seconds);
  }

Код для робота 2

// Create the link
  serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true);

  // Do not run code UNTIL the Brains are linked
   while (!link.isLinked()) {
    wait(0.1, seconds);
  }

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Robot 2 - Worker");
  Brain.Screen.newLine();
  Brain.Screen.print("Waiting...");

  // Track the last state
  uint8_t lastShown = 255;

  while (true) {
    // Variable stores 1 - pressed, 0 - not pressed 
    uint8_t state = 0;
    int32_t n = link.receive(&state, 1, 200);

    // Only update screen if state changes
    if (n == 1 && state != lastShown) {
      Brain.Screen.clearScreen();
      Brain.Screen.setCursor(1, 1);
      Brain.Screen.print("Robot 2 - Worker");
      Brain.Screen.newLine();

      // Display text if Robot 1's screen is being pressed
      if (state == 1) {
        Brain.Screen.print("Manager IS being pressed!");
      } else {
        Brain.Screen.print("Manager is NOT being pressed");
      }

      lastShown = state;
    }
    wait(0.02, seconds);
  }

receive#

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

Available Functions

1 — Принимает сообщение в символьный буфер с возможностью установки таймаута.

int32_t receive( 
  char    *buffer, 
  int32_t  length, 
  int32_t  timeoutMs = 500);

Parameters

Параметр

Тип

Описание

buffer

char*

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

length

int32_t

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

timeoutMs

int32_t

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

Return Values

Возвращает значение int32_t , представляющее количество полученных байтов.

Notes
  • receive возвращает следующее сообщение из очереди от другого связанного модуля EXP Brain.

  • Сообщения читаются в порядке FIFO (сначала самые старые непрочитанные).

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

  • Если в этом окне не поступает ни одного сообщения, команда receive возвращает 0, и любое сообщение, отправленное после этого, остается в очереди для чтения при следующем использовании команды receive.

Examples

Код для робота 1

// Create the link
  serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true);

  // Do not run code UNTIL the Brains are linked
  while (!link.isLinked()) {
    wait(0.1, seconds);
  }

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Robot 1 - Manager");

  // Track last sent state
  uint8_t lastState = 255;  // impossible initial value

 // Tell Robot 2 when the screen is being pressed
  while (true) {
    uint8_t state = Brain.Screen.pressing() ? 1 : 0;

    // Only send if state changed
    if (state != lastState) {
      link.send(&state, 1);
      lastState = state;
    }

    wait(0.02, seconds);
  }

Код для робота 2

// Create the link
  serial_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true);

  // Do not run code UNTIL the Brains are linked
   while (!link.isLinked()) {
    wait(0.1, seconds);
  }

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Robot 2 - Worker");
  Brain.Screen.newLine();
  Brain.Screen.print("Waiting...");

  // Track the last state
  uint8_t lastShown = 255;

  while (true) {
    // Variable stores 1 - pressed, 0 - not pressed 
    uint8_t state = 0;
    int32_t n = link.receive(&state, 1, 200);

    // Only update screen if state changes
    if (n == 1 && state != lastShown) {
      Brain.Screen.clearScreen();
      Brain.Screen.setCursor(1, 1);
      Brain.Screen.print("Robot 2 - Worker");
      Brain.Screen.newLine();

      // Display text if Robot 1's screen is being pressed
      if (state == 1) {
        Brain.Screen.print("Manager IS being pressed!");
      } else {
        Brain.Screen.print("Manager is NOT being pressed");
      }

      lastShown = state;
    }
    wait(0.02, seconds);
  }

received#

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

Available Functions

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

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

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

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 — Регистрирует функцию обратного вызова, вызываемую только для полученных сообщений, имя которых совпадает с message, где полезная нагрузка сообщения включает дополнительное поле int32_t.

void received( 
  const char *message, void (* callback)(const char *, const char *, int32_t, double) );

Parameters

Параметр

Тип

Описание

message

const char*

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

callback

function

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

Return Values

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

Notes
  • Получено received обратный вызов с четырьмя аргументами:

Callback Signature

callback(message, linkname, index, value)

Аргумент

Описание

message

Имя полученного сообщения (например, “add”).

linkname

Название ссылки, с которой было получено сообщение.

index

Целочисленное значение, отправляемое вместе с сообщением (если указано).

value

Значение с плавающей запятой, отправляемое вместе с сообщением (если оно предоставлено).

Examples

Код для робота 1

// Send left or right when pressed
void screen_pressed() {
  if (Brain.Screen.xPosition() < 240) {
    link.send((uint8_t*)"left", 4);
  } else {
    link.send((uint8_t*)"right", 5);
  }
}

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

// Create the link
serial_link 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");


  Brain.Screen.pressed(screen_pressed);
}

Код для робота 2

// Called when message received
void received_callback(uint8_t *buffer, int32_t length) {
  char msg[32];

  // Copy safely and null terminate
  int n = (length < 31) ? length : 31;
  memcpy(msg, buffer, n);
  msg[n] = '\0';

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1,1);
  Brain.Screen.print("Robot 2 - Worker");
  Brain.Screen.newLine();

  // Display if Robot 1's screen is pressed on left or right
  if (strcmp(msg, "left") == 0) {
    Brain.Screen.print("Manager pressed LEFT");
  }
  else if (strcmp(msg, "right") == 0) {
    Brain.Screen.print("Manager pressed RIGHT");
  }
}

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

// Create the link
serial_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(received_callback);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1,1);
  Brain.Screen.print("Robot 2 - Worker");
  Brain.Screen.newLine();
  Brain.Screen.print("Waiting...");
}

назад

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

вперёд

Рабочая ячейка CTE

На этой странице
  • Введение
  • Конструкторы классов
  • Деструктор класса
  • Параметры
  • Примечания
  • Пример
  • Функции участников
    • 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)