SerialLink#
Giới thiệu#
SerialLink cho phép hai EXP Brain giao tiếp bằng cách gửi và nhận dữ liệu nối tiếp thô qua VEX Link. Thay vì các thông điệp được gắn nhãn, SerialLink truyền một bộ đệm (một chuỗi ký tự hoặc một mảng byte). Điều này làm cho nó hữu ích cho giao tiếp robot-với-robot nâng cao, chẳng hạn như truyền dữ liệu cảm biến, gửi các định dạng gói tùy chỉnh hoặc xây dựng giao thức riêng của bạn dựa trên các byte.
Mỗi lần sử dụng send sẽ thêm dữ liệu vào bộ đệm nhận của EXP Brain được liên kết. Dữ liệu được đọc theo thứ tự đến (vào trước ra trước). Nếu nhiều bộ đệm được gửi trước khi EXP Brain kia sử dụng receive, chúng sẽ vẫn được xếp hàng và được trả về từng cái một theo thứ tự chúng được gửi. Vì dữ liệu có thể được xếp hàng, việc liên tục gửi các bộ đệm lớn trong mỗi vòng lặp có thể tạo ra tắc nghẽn; đối với các liên kết cần thời gian chính xác, chỉ gửi những gì bạn cần.
Quan trọng: Cả hai robot phải cùng lúc chạy các dự án sử dụng SerialLink SerialLink , nếu không sẽ không có dữ liệu nào được gửi/nhận.
Trang này sử dụng link làm ví dụ cho tên SerialLink thay thế bằng tên do bạn cấu hình nếu cần.
Dưới đây là danh sách các phương pháp có sẵn:
is_linked– Trả về liệu Brain này có đang được kết nối tích cực với Brain được ghép nối của nó hay không.send– Gửi một tin nhắn ngắn (với dữ liệu int/float tùy chọn) tới Brain được ghép nối.receive– Chờ và trả về tin nhắn đến tiếp theo.received– Đăng ký một hàm được gọi bất cứ khi nào nhận được tin nhắn mới.
Tạo liên kết#
Tạo SerialLink trên cả hai EXP Brain để thiết lập kênh liên lạc giữa chúng — có thể là không dây với V5 Robot Radio hoặc thông qua cáp thông minh có dây — để các robot có thể gửi dữ liệu nối tiếp thô cho nhau.
SerialLink(smartport, name, linktype, wired)
Tham số |
Sự miêu tả |
|---|---|
|
Cổng thông minh được sử dụng cho liên kết này—cổng mà bộ thu phát vô tuyến V5 Robot được kết nối (không dây) hoặc cáp thông minh được cắm vào (có dây). Được viết dưới dạng |
|
Tên duy nhất để đặt cho liên kết này dưới dạng chuỗi. |
|
Vai trò mà Brain này sẽ sử dụng cho cặp liên kết này. Mỗi cặp phải bao gồm một Manager và một Worker:
|
|
Tùy chọn. Kết nối này là có dây hay không dây:
|
Mã lệnh cho Robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Mã lệnh cho Robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Các phương pháp có sẵn#
Sau khi SerialLink được thiết lập và các Brains được liên kết, bạn có thể sử dụng các phương pháp dưới đây để gửi, nhận và phản hồi dữ liệu nối tiếp thô.
is_linked#
Phương thức is_linked trả về trạng thái cho biết các EXP Brains trên SerialLink có được ghép nối với nhau hay không.
True– Hai bộ não EXP được ghép nối và đang giao tiếp qua liên kết này.False– Hai bộ não EXP không được ghép nối trên liên kết này.
Lưu ý: Tốt nhất là luôn kiểm tra để đảm bảo các EXP Brains đã được liên kết trước khi chạy bất kỳ đoạn mã nào khác khi bắt đầu dự án.
Usage:
link.is_linked()
Thông số |
Sự miêu tả |
|---|---|
Phương pháp này không có tham số. |
Mã lệnh cho Robot 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")Mã lệnh cho Robot 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 truyền các byte nối tiếp thô đến EXP Brain được liên kết khác.
Khi đọc dữ liệu đó bằng receive, receive sẽ chỉ trả về sau khi nó đã thu thập được số byte được chỉ định bởi tham số receive của nó. Vì vậy, nếu mã của bạn luôn gọi length với độ dài length, bạn nên đảm bảo mỗi tin nhắn được gửi bằng send có chính xác số byte đó (thường bằng cách thêm phần đệm) để người nhận không bị chặn chờ thêm byte.
Nếu bạn không muốn phụ thuộc vào số lượng byte chính xác, hãy sử dụng received thay thế; nó cho phép bạn xử lý bất kỳ byte nào có sẵn mà không yêu cầu độ dài cụ thể.
Usage:
send(buffer)
Thông số |
Sự miêu tả |
|---|---|
|
The data to send to the other linked EXP Brain. This can be a |
Mã lệnh cho Robot 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")Mã lệnh cho Robot 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 trả về dữ liệu nối tiếp từ EXP Brain được liên kết khác theo thứ tự FIFO (dữ liệu chưa đọc cũ nhất trước).
Vì receive chờ một lượng byte chính xác, việc nhắn tin có độ dài cố định thường yêu cầu thêm phần đệm khi sử dụng receive để mỗi tin nhắn đạt kích thước dự kiến. Nếu người gửi truyền ít hơn send byte, length sẽ tiếp tục chờ các byte còn lại và không trả về gì.
Nếu hàng đợi trống và bạn cung cấp thời gian chờ timeout, receive và chờ tối đa 0 mili giây để nhận dữ liệu mới. Nếu không có gì đến trong khoảng thời gian đó, nó sẽ trả về NoneBất kỳ dữ liệu nào được gửi sau đó vẫn được xếp vào hàng đợi để đọc sau.
Usage:
receive(length, timeout)
Thông số |
Sự miêu tả |
|---|---|
|
Số byte cần nhận. |
|
Tùy chọn. Thời gian chờ (tính bằng mili giây) |
Mã lệnh cho Robot 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)Mã lệnh cho Robot 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 đăng ký một hàm sẽ được gọi bất cứ khi nào EXP Brain nhận được dữ liệu nối tiếp.
Usage:
link.received(callback)
Thông số |
Sự miêu tả |
|---|---|
|
Một hàm được định nghĩa trước đó sẽ thực thi khi EXP Brain nhận được dữ liệu nối tiếp. |
received hàm gọi lại được gọi với hai đối số:
Chữ ký hàm gọi lại:
callback(buffer, length)
Lý lẽ |
Sự miêu tả |
|---|---|
|
Một mảng byte |
|
Số byte hợp lệ nhận được trong bộ đệm |
Mã lệnh cho Robot 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")Mã lệnh cho Robot 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)