• 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 V5
  • เอกสารอ้างอิง API VEX V5
  • วีเอ็กซ์ลิงก์
  • ลิงก์อนุกรม
ไทย
  • 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 สาย
    • คอนโซล
    • ตรรกะ
    • วีเอ็กซ์ลิงก์
      • ลิงก์ข้อความ
      • ลิงก์อนุกรม
    • เวิร์กเซลล์ 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

ลิงก์อนุกรม#

  • การแนะนำ

  • ตัวสร้างคลาส

  • ตัวทำลายคลาส

  • พารามิเตอร์

  • หมายเหตุ

  • ตัวอย่าง

  • ฟังก์ชันสมาชิก

    • เชื่อมโยง

    • ส่ง

    • รับ

    • ได้รับ

การแนะนำ#

คลาส serial_link อนุญาตให้ส่งกระแสข้อมูลไบต์ดิบระหว่างหุ่นยนต์ได้ ออกแบบมาสำหรับการสื่อสารระหว่างหุ่นยนต์ โดยที่หุ่นยนต์ผู้ส่งและผู้รับเข้าใจเนื้อหาของกระแสข้อมูลนั้น

การใช้งาน send ทุกครั้งจะเพิ่มข้อมูลลงในคิวของ V5 Brain ที่เชื่อมโยง และคิวจะถูกอ่านแบบเข้าก่อนออกก่อน (FIFO) หากมีการส่งข้อความหลายข้อความก่อนที่ V5 Brain อีกตัวจะใช้การรับ ข้อความเหล่านั้นจะถูกจัดเก็บและส่งคืนทีละข้อความตามลำดับที่ส่ง เนื่องจากข้อความสามารถอยู่ในคิวได้ การส่งสถานะเดียวกันซ้ำๆ ในแต่ละรอบอาจทำให้เกิดงานค้าง สำหรับตรรกะที่สำคัญต่อเวลา ให้ส่งเฉพาะเมื่อค่าเปลี่ยนแปลงเท่านั้น

สำคัญ: หุ่นยนต์ทั้งสองตัวต้องรันโปรเจกต์ที่ใช้ serial_link พร้อมกัน มิฉะนั้นจะไม่มีการส่ง/รับข้อมูล

ตัวสร้างคลาส#

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

ตัวทำลายคลาส#

ทำลายอ็อบเจ็กต์ 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 ที่เชื่อมต่อกับสมาร์ทพอร์ต

  • วิทยุ VEXlink สามารถใช้งานร่วมกับวิทยุ VEXnet ของคอนโทรลเลอร์ V5 ได้ โดยควรเชื่อมต่อเข้ากับ Smart Port ที่มีหมายเลขสูงสุดเพื่อหลีกเลี่ยงปัญหาการทำงานขัดแย้ง

  • ในการสร้าง VEXlink จำเป็นต้องเชื่อมต่อ V5 Brain ทั้งสองตัวเข้ากับ V5 Robot Radio

ตัวอย่าง#

รหัสสำหรับหุ่นยนต์ตัวที่ 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 — ตรวจสอบว่า V5 Brains จับคู่และสื่อสารกันบนลิงก์นี้หรือไม่

  • send — ส่งข้อความไปยังสมองที่จับคู่กัน

  • receive — รอและส่งคืนข้อความขาเข้าถัดไป

  • received — ลงทะเบียนฟังก์ชันที่จะถูกเรียกเมื่อใดก็ตามที่ได้รับข้อความใหม่

ก่อนเรียกใช้ฟังก์ชันสมาชิก 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#

ตรวจสอบว่า V5 Brains ที่เชื่อมต่อผ่านพอร์ตอนุกรมนั้นจับคู่กันหรือไม่

Available Functions
bool isLinked();

Parameters

ฟังก์ชันนี้ไม่มีพารามิเตอร์ใดๆ

Return Values

ส่งคืนค่าบูลีนที่ระบุว่า V5 Brain เชื่อมต่อกันหรือไม่:

  • true — The two V5 Brains are paired and communicating on this link.
  • false — The two V5 Brains are not paired on this link.
Notes
  • เป็นเรื่องที่ควรปฏิบัติเสมอให้แน่ใจว่าได้เชื่อมต่อ V5 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*

ข้อมูลสำรองที่จะส่งไปยัง V5 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 ส่งคืนข้อความที่อยู่ในคิวถัดไปจาก V5 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#

ลงทะเบียนฟังก์ชันที่จะถูกเรียกใช้ทุกครั้งที่ V5 Brain ได้รับข้อมูล

Available Functions

1 — ลงทะเบียนฟังก์ชันเรียกกลับสำหรับบัฟเฟอร์ไบต์ที่ได้รับแต่ละรายการ

void received( 
  void (* callback)(uint8_t *, int32_t) );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

callback

void (*)(uint8_t *, int32_t)

ฟังก์ชันที่กำหนดไว้ก่อนหน้านี้ ซึ่งจะทำงานเมื่อ V5 Brain ได้รับข้อมูล

Return Values

ฟังก์ชันนี้ไม่ส่งค่ากลับ

Notes
  • received ฟังก์ชันเรียกกลับ (callback) จะถูกเรียกโดยมีอาร์กิวเมนต์สองตัว ได้แก่ บัฟเฟอร์ไบต์และจำนวนไบต์ที่ได้รับ

  • ข้อมูลที่ได้รับอาจไม่ได้ลงท้ายด้วยค่าว่าง (null) หากฟังก์ชันเรียกกลับ (callback) ถือว่าข้อมูลเป็นสตริง ให้คัดลอกไบต์ที่ได้รับลงในอาร์เรย์อักขระแล้วเพิ่มตัวจบสตริง (null terminator) เข้าไป

Callback Signature

callback(buffer, length)

การโต้แย้ง

คำอธิบาย

buffer

ตัวชี้ไปยังบัฟเฟอร์ไบต์ที่ได้รับ

length

จำนวนไบต์ที่ได้รับ

Examples

รหัสสำหรับหุ่นยนต์ตัวที่ 1

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

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

  // 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

// 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...");

  while (true) {
    wait(10, msec);
  }
}

previous

ลิงก์ข้อความ

next

เวิร์กเซลล์ CTE

On this page
  • การแนะนำ
  • ตัวสร้างคลาส
  • ตัวทำลายคลาส
  • พารามิเตอร์
  • หมายเหตุ
  • ตัวอย่าง
  • ฟังก์ชันสมาชิก
    • isLinked
    • send
    • receive
    • received
Innovation First, International
​

VEX และ VEX Robotics เป็นเครื่องหมายการค้าหรือเครื่องหมายบริการของ Innovation First, Inc. ลิขสิทธิ์ ©2026สงวนลิขสิทธิ์ทุกประการ VEX Robotics, Inc. เป็นบริษัทในเครือของ Innovation First International, Inc. ชื่อผลิตภัณฑ์/เครื่องหมายอื่นๆ ทั้งหมดเป็นทรัพย์สินของเจ้าของที่เกี่ยวข้อง สิทธิบัตรและ/หรือสิทธิบัตรที่อยู่ระหว่างการยื่นขอ - innovationfirst.com/patents
นโยบายความเป็นส่วนตัวของเว็บไซต์ / ข้อกำหนดการใช้งานเว็บไซต์ / นโยบายคุกกี้ / นโยบายความเป็นส่วนตัวของซอฟต์แวร์

เยี่ยมชมเพจ Facebook ของ VEX Robotics เยี่ยมชมหน้าทวิตเตอร์ของ VEX Robotics เยี่ยมชมเพจ Instagram ของ VEX Robotics ได้ที่นี่ เยี่ยมชมเพจ YouTube ของ VEX Robotics
แบบฟอร์มแสดงความคิดเห็น 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)