• 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
Ir para o conteúdo principal
Ctrl+K

< Back to Platform Select

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

Navegação da secção

  • Blocos
  • Python
  • C++
    • Transmissão
    • Motores e Controladores de Motores
    • Dispositivos de 3 fios
    • Cérebro
    • Consola
    • Controlador
    • Lógica
    • Dispositivos de porta inteligentes
    • VEXlink
      • Link da mensagem
      • Link serial
    • Célula de trabalho CTE
  • Tutoriais VEXcode

Navegação da plataforma

  • 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

Link serial#

  • Introdução

  • Construtores de Classes

  • Destrutor de classes

  • Parâmetros

  • Notas

  • Exemplo

  • Funções de membro

    • está vinculado

    • enviar

    • receber

    • recebido

Introdução#

A classe serial_link permite o envio de um fluxo de bytes em bruto entre robots. Foi concebida para a comunicação robô-a-robô, onde tanto o robô transmissor como o recetor compreendem o conteúdo do fluxo de dados.

Cada utilização de send adiciona dados à fila do EXP Brain ligado, e a fila é lida pela ordem de chegada (FIFO). Se forem enviadas várias mensagens antes de o outro EXP Brain utilizar receive, estas serão armazenadas e devolvidas uma de cada vez, pela ordem em que foram enviadas. Como as mensagens podem ser colocadas em fila, enviar repetidamente o mesmo estado a cada iteração do ciclo pode criar uma acumulação; para a lógica crítica em termos de tempo, envie apenas quando os valores se alteram.

Importante: Ambos os robôs devem estar a executar projetos que utilizem serial_link em simultâneo, caso contrário, não serão enviados/recebidos quaisquer dados.

Construtores de Classes#

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

Destrutor de classes#

Destrói o objeto serial_link serial_link recursos associados.

~serial_link();

Parâmetros#

Parâmetro

Tipo

Descrição

index

int32_t

A Smart Port à qual a ligação da mensagem está ligada, escrita como PORTx, em que x é o número da porta (por exemplo, PORT1).

name

const char*

O nome deste link. Recomenda-se que esta sequência única seja suficientemente longa para que, ao ser processada pelo Vexos, gere um ID único. Um nome de link inadequado seria algo genérico como “vexlink”, pois pode estar a ser utilizado por outra equipa.

type

linkType

O tipo de ligação, seja linkType::manager ou linkType::workerEsta informação é utilizada para configurar correctamente o rádio e determina também a largura de banda disponível para transmissão e recepção. Um robô gestor tem o dobro da largura de banda disponível (1040 bytes/segundo) para enviar informação ao robô trabalhador (520 bytes/segundo).

  • linkType::manager — O objeto serial_link é um gestor
  • linkType::worker — O objeto serial_link é um trabalhador

isWired

bool

Indica se o objeto serial_link é cablado (o predefinido é false):

  • true — O objeto serial_link é cablado
  • false — O objeto serial_link é wireless

Notas#

  • O VEXlink suporta comunicação sem fios e com fios, sendo que para ligações com fios recomenda-se a utilização de um cabo inteligente modificado para evitar problemas de encaminhamento de energia.

  • Para comunicação sem fios, cada robô necessita de um rádio V5 Robot ligado a uma porta inteligente.

  • O rádio VEXlink pode ser utilizado em conjunto com o rádio VEXnet de um controlador EXP, que deve ser ligado à porta Smart de número mais elevado para evitar conflitos.

  • Para criar um VEXlink, ambos os EXP Brains devem estar ligados a um rádio de robô V5.

Exemplo#

Código para o Robot 1

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

Código para o Robot 2

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

Funções de membro#

A classe serial_link inclui as seguintes funções membro:

  • isLinked — Verifica se os cérebros EXP estão emparelhados e a comunicar neste link.

  • send — Envia uma mensagem para o Brain emparelhado.

  • receive — Aguarda e devolve a próxima mensagem recebida.

  • received — Regista uma função a chamar sempre que uma nova mensagem é recebida.

Antes de chamar qualquer função membro de serial_link , deve ser criada uma instância de serial_link ), como se mostra abaixo:

Código para o Robot 1

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

Código para o Robot 2

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

isLinked#

Retorna se os EXP Brains numa ligação série estão emparelhados entre si.

Available Functions
bool isLinked();

Parameters

Esta função não tem parâmetros.

Return Values

Retorna um valor booleano indicando se os cérebros EXP estão ligados:

  • true — The two EXP Brains are paired and communicating on this link.
  • false — The two EXP Brains are not paired on this link.
Notes
  • É uma boa prática verificar sempre se os EXP Brains estão ligados no início de um projeto, antes de executar qualquer outro código.

Examples

Código para o Robot 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));

Código para o Robot 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#

Envia uma mensagem para o cérebro emparelhado.

Available Functions

1 — Envia uma mensagem utilizando um buffer de bytes.

int32_t send( 
  uint8_t *buffer, 
  int32_t  length );

2 — Envia uma mensagem utilizando um buffer de caracteres.

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

Parameters

Parâmetro

Tipo

Descrição

buffer

uint8_t* or const char*

O buffer a enviar para o outro EXP Brain ligado.

length

int32_t

O tamanho do buffer a enviar.

Return Values

Retorna um int32_t int32_t que representa o número de bytes enviados.

Examples

Código para o Robot 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);
  }

Código para o Robot 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#

Aguarda e devolve a próxima mensagem recebida.

Available Functions

1 — Recebe uma mensagem num buffer de caracteres com tempo limite opcional.

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

Parameters

Parâmetro

Tipo

Descrição

buffer

char*

O buffer para armazenar a mensagem recebida.

length

int32_t

O comprimento do buffer.

timeoutMs

int32_t

Tempo em milissegundos receive para aguardar por uma nova mensagem apenas se a fila estiver vazia (o predefinido é 500 ms).

Return Values

Retorna um int32_t int32_t que representa o número de bytes recebidos.

Notes
  • receive e devolve a próxima mensagem em fila do outro EXP Brain ligado.

  • As mensagens são lidas pela ordem FIFO (da mais antiga não lida para a primeira).

  • Se a fila estiver vazia quando receive é chamado, espera até ao tempo limite especificado timeoutMs por uma nova mensagem.

  • Se nenhuma mensagem chegar a esta janela, receive retorna 0, e qualquer mensagem enviada posteriormente permanece na fila para ser lida na próxima vez que receive for utilizado.

Examples

Código para o Robot 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);
  }

Código para o Robot 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#

Regista uma função a ser chamada sempre que o EXP Brain receber uma mensagem enviada.

Available Functions

1 — Regista uma função de chamada de retorno para cada mensagem recebida.

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

2 — Regista um callback invocado para cada mensagem recebida que inclui um campo int32_t adicional.

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

3 — Regista um callback invocado apenas para mensagens recebidas cujo nome corresponda à mensagem.

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

4 — Regista um callback invocado apenas para mensagens recebidas cujo nome corresponde à mensagem, em que a carga útil da mensagem inclui um campo int32_t adicional.

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

Parameters

Parâmetro

Tipo

Descrição

message

const char*

O nome da mensagem (string) a corresponder. Quando o nome de uma mensagem recebida corresponde a este valor, é chamada a função de retorno de chamada callback.

callback

function

Uma função previamente definida que é executada quando o EXP Brain recebe uma mensagem que corresponde à mensagem message.

Return Values

Esta função não devolve qualquer valor.

Notes
  • received chamada de retorno com quatro argumentos:

Callback Signature

callback(message, linkname, index, value)

Discussão

Descrição

message

O nome da mensagem recebida (por exemplo, “add”).

linkname

O nome do link a partir do qual a mensagem foi recebida.

index

O valor inteiro enviado com a mensagem (se fornecido).

value

O valor float enviado com a mensagem (se fornecido).

Examples

Código para o Robot 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);
}

Código para o Robot 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...");
}

anterior

Link da mensagem

próximo

Célula de trabalho CTE

On this page
  • Introdução
  • Construtores de Classes
  • Destrutor de classes
  • Parâmetros
  • Notas
  • Exemplo
  • Funções de membro
    • isLinked
    • send
    • receive
    • received
Innovation First, International
​

VEX e VEX Robotics são marcas registadas ou marcas de serviço da Innovation First, Inc. Copyright ©2026. Todos os direitos reservados. A VEX Robotics, Inc. é uma subsidiária da Innovation First International, Inc. Todos os outros nomes/marcas de produtos de terceiros são propriedade dos seus respetivos proprietários. Patentes e/ou patentes pendentes - innovationfirst.com/patents
Política de Privacidade do Site / Termos de Utilização do Site / Política de Cookies / Política de Privacidade do Software

Visite a página do VEX Robotics no Facebook. Visite a página do VEX Robotics no Twitter. Visite a página do VEX Robotics no Instagram. Visite a página da VEX Robotics no YouTube.
Formulário de feedback da API VEX

Valorizamos o seu feedback! Utilize este formulário para partilhar sugestões, elogios ou comunicar erros na API VEX. A sua contribuição ajuda-nos a melhorar a documentação da API VEX.

​

Se estiver a ter problemas técnicos ou precisar de apoio ao cliente, visite support.vex.com.

  • Send Happy Feedback
  • Send Sad Feedback

Nota: o URL atual será partilhado com a sua mensagem.

Ao incluir o seu endereço de e-mail, concorda que a VEX poderá enviar-lhe e-mails caso tenhamos dúvidas sobre o seu feedback.
Política de Privacidade >
Por favor, envie o seu feedback. Feedback enviado com sucesso!
Choose Which VEX IQ Generation to View

VEX IQ (1st gen)

VEX IQ (2nd gen)