Серійне посилання#
Вступ#
SerialLink дозволяє двом EXP Brains взаємодіяти, надсилаючи та отримуючи необроблені послідовні дані через VEX Link. Замість позначених повідомлень, SerialLink передає буфер (рядок або масив байтів). Це робить його корисним для просунутого зв’язку між роботами, такого як потокова передача даних датчиків, надсилання користувацьких форматів пакетів або створення власного протоколу поверх байтів.
Кожне використання send додає дані до буфера отримання пов’язаного EXP Brain. Дані зчитуються в порядку надходження (першим прийшов, першим вийшов). Якщо кілька буферів надсилається до того, як інший EXP Brain використовує receive, вони залишаються в черзі та повертаються по одному в порядку надсилання. Оскільки дані можуть стояти в черзі, багаторазове надсилання великих буферів у кожному циклі може створювати затримки; для критичних за часом посилань надсилайте лише те, що вам потрібно.
Важливо: Обидва роботи повинні одночасно запускати проекти, що використовують SerialLink , інакше дані не будуть надсилатися/отримуватися.
На цій сторінці як SerialLink використовується link За потреби замініть її власною налаштованою назвою.
Нижче наведено список доступних методів:
is_linked– Повертає, чи цей Мозок активно підключений до свого парного Мозку.send– Надсилає коротке повідомлення (з необов’язковими цілочисельними/чисельними числами з плаваючою комою) парному Brain.receive– Очікує та повертає наступне вхідне повідомлення.received– Реєструє функцію, яка викликається щоразу, коли надходить нове повідомлення.
Створити посилання#
Створіть послідовний порт SerialLink на обох EXP Brains, щоб встановити канал зв’язку між ними — або бездротовим способом за допомогою радіостанцій V5 Robot Radio, або через дротовий Smart Cable — щоб роботи могли надсилати один одному необроблені послідовні дані.
SerialLink(smartport, name, linktype, wired)
Параметр |
Опис |
|---|---|
|
Розумний порт, що використовується для цього з’єднання — порт, до якого підключено радіо V5 Robot (бездротовий зв’язок) або до якого підключено розумний кабель (дротовий зв’язок). Записується як |
|
Унікальна назва, яка буде надана цьому посиланню у вигляді рядка. |
|
Роль, яку цей Мозок використовуватиме для цієї пари посилань. Кожна пара повинна містити одного Менеджера та одного Працівника:
|
|
Необов’язково. Чи є це з’єднання дротовим, чи бездротовим:
|
Код для робота 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Код для Робота 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Доступні методи#
Після налаштування SerialLink та підключення модулів Brains ви можете використовувати наведені нижче методи для надсилання, отримання та відповіді на необроблені послідовні дані.
is_linked#
Метод is_linked повертає, чи пов’язані між собою EXP Brains на SerialLink.
True– Два EXP-мозки спарені та спілкуються через цей канал.False– Два мізки EXP не спарені на цьому зв’язку.
Примітка: Рекомендується завжди перевіряти, чи пов’язані EXP Brains на початку проєкту, перш ніж запускати будь-який подальший код.
Usage:
link.is_linked()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
Код для робота 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Код для Робота 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
send#
send передає необроблені послідовні байти до іншого підключеного EXP Brain.
Під час читання цих даних за допомогою receive, receive поверне значення лише після того, як збере кількість байтів, визначену параметром length Через це, якщо ваш код завжди викликає receive з фіксованою довжиною length, вам слід переконатися, що кожне повідомлення, надіслане за допомогою send містить саме таку кількість байтів (часто шляхом доповнення), щоб одержувач не блокував очікування додаткових байтів.
Якщо ви не хочете залежати від точної кількості байтів, використовуйте замість цього received; це дозволяє обробляти будь-які доступні байти без вимоги до певної довжини.
Usage:
send(buffer)
Параметри |
Опис |
|---|---|
|
Дані, які потрібно надіслати іншому підключеному EXP Brain. Це може бути рядок |
Код для робота 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Код для Робота 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)
receive#
receive повертає послідовні дані з іншого підключеного EXP Brain у порядку FIFO (спочатку найстаріші непрочитані дані).
Оскільки receive очікує на точну кількість байтів, обмін повідомленнями фіксованої довжини часто потребує доповнення при використанні send , щоб кожне повідомлення досягало очікуваного розміру. Якщо відправник передає менше ніж length байтів, receive продовжуватиме очікувати на решту байтів і нічого не повертатиме.
Якщо черга порожня, і ви вкажете тайм-аут timeout, receive то очікування нових даних триватиме до певної кількості мілісекунд. Якщо в цьому вікні нічого не надходить, повертається NoneБудь-які дані, надіслані після цього, залишаються в черзі для подальшого зчитування.
Usage:
receive(length, timeout)
Параметри |
Опис |
|---|---|
|
Кількість байтів для отримання. |
|
Необов’язково. Скільки часу в мілісекундах |
Код для робота 1
# Send a math problem for the other Brain to solve # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ packet = "add,7,2.5" # Pad with spaces until it's exactly 16 bytes while len(packet) < 16: packet = packet + " " link.send(packet)Код для Робота 2
# Solve the math problem that the other Brain sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # Receive exactly 16 bytes buffer = link.receive(16) # Remove the added " " padding text = buffer.decode().strip() # Separate the operator and numbers parts = text.split(",") operator = parts[0] a = float(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If not "add" or "subtract", do nothing else: pass brain.screen.print("Result = ", result)
received#
received реєструє функцію, яка викликається щоразу, коли EXP Brain отримує послідовні дані.
Usage:
link.received(callback)
Параметри |
Опис |
|---|---|
|
Раніше визначена функція, яка виконується, коли EXP Brain отримує послідовні дані. |
received викликів зворотних викликів з двома аргументами:
Підпис зворотного виклику:
callback(buffer, length)
Аргумент |
Опис |
|---|---|
|
A |
|
Кількість дійсних байтів, отриманих у буфері |
Код для робота 1
# Send a message to the other robot # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") link.send("HELLO")Код для Робота 2
# Display the message that Robot 1 sends # Create the link link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() def received_message(bytearray, length): # Slice the bytearray to the valid data data = bytearray[:length] # Decode and strip the message before displaying it text = data.decode().strip() brain.screen.print("Got: ", text) # Call received_message whenever a message is received link.received(received_message)