SerialLink#
Zavedení#
SerialLink umožňuje dvěma robotům V5 Brains komunikovat odesíláním a přijímáním nezpracovaných sériových dat přes VEX Link. Místo označených zpráv přenáší SerialLink vyrovnávací paměť (řetězec nebo pole bajtů). Díky tomu je užitečný pro pokročilou komunikaci mezi roboty, jako je streamování dat ze senzorů, odesílání vlastních formátů paketů nebo vytváření vlastního protokolu na základě bajtů.
Každé použití send přidává data do přijímacího bufferu propojeného V5 Brain. Data se čtou v pořadí, v jakém dorazí (first in, first out). Pokud je odesláno více bufferů předtím, než druhý V5 Brain použije receive, zůstanou zařazeny do fronty a vracejí se jeden po druhém v pořadí, v jakém byly odeslány. Protože se data mohou čekat ve frontě, opakované odesílání velkých bufferů v každé smyčce může způsobit nahromadění dat; u časově kritických odkazů odesílejte pouze to, co potřebujete.
Důležité: Oba roboti musí současně spouštět projekty, které používají SerialLink , jinak nebudou odesílána/přijímána žádná data.
Tato stránka používá jako SerialLink název link V případě potřeby jej nahraďte vlastním nakonfigurovaným názvem.
Níže je uveden seznam dostupných metod:
Vytvořit odkaz#
Vytvořte na obou robotech V5 Brains sériový kanál SerialLink, abyste mezi nimi navázali komunikační kanál – buď bezdrátově s robotickými rádii V5, nebo prostřednictvím kabelového inteligentního kabelu Smart Cable – aby si roboti mohli navzájem posílat nezpracovaná sériová data.
SerialLink(smartport, name, linktype, wired)
Parametr |
Popis |
|---|---|
|
Inteligentní port použitý pro toto propojení – port, ke kterému je připojeno robotické rádio V5 (bezdrátově) nebo je do něj zapojen inteligentní kabel (kabelově). Zapisuje se jako |
|
Jedinečný název, který se má tomuto odkazu zadat jako řetězec. |
|
Role, kterou tento mozek použije pro tento pár odkazů. Každý pár musí obsahovat jednoho manažera a jednoho pracovníka:
|
|
Volitelné. Zda je toto připojení kabelové nebo bezdrátové:
|
Kód pro robota 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kód pro Robota 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Dostupné metody#
Jakmile je SerialLink nastaven a Brains propojeny, můžete k odesílání, přijímání a odpovídání na nezpracovaná sériová data použít níže uvedené metody.
is_linked#
Metoda is_linked vrací, zda jsou V5 Brainy na SerialLinku vzájemně spárovány.
True– Dva mozky V5 jsou spárované a komunikují prostřednictvím tohoto spojení.False– Dva mozky V5 nejsou v tomto spojení spárovány.
Poznámka: Je dobrým zvykem vždy na začátku projektu zkontrolovat, zda jsou V5 Brains propojeny, než spustíte jakýkoli další kód.
Usage:
link.is_linked()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
Kód pro robota 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")Kód pro Robota 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 odesílá nezpracované sériové bajty do druhého připojeného V5 Brainu.
Při čtení těchto dat pomocí receive se receive vrátí pouze tehdy, když shromáždí počet bajtů určený parametrem length Pokud tedy váš kód vždy volá receive s pevnou délkou length, měli byste zajistit, aby každá zpráva odeslaná pomocí send měla přesně tento počet bajtů (často doplněním), aby přijímač neblokoval čekání na další bajty.
Pokud se nechcete spoléhat na přesný počet bajtů, použijte místo toho received; to vám umožní zpracovat libovolné dostupné bajty bez nutnosti specifické délky.
Usage:
send(buffer)
Parametry |
Popis |
|---|---|
|
The data to send to the other linked V5 Brain. This can be a |
Kód pro robota 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")Kód pro Robota 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 vrací sériová data z druhého propojeného V5 Brainu v pořadí FIFO (nejstarší nepřečtená data jako první).
Protože receive čeká na přesný počet bajtů, zprávy s pevnou délkou často vyžadují při použití funkcí send doplnění, aby každá zpráva dosáhla očekávané velikosti. Pokud odesílatel odešle méně než length bajtů, receive bude pokračovat v čekání na zbývající bajty a nic nevrátí.
Pokud je fronta prázdná a zadáte časový limit timeout receive čeká na nová data až po dobu odpovídajícího počtu milisekund. Pokud v tomto okně nic nedorazí, vrátí hodnotu NoneVeškerá data odeslaná poté zůstanou zařazena do fronty pro pozdější čtení.
Usage:
receive(length, timeout)
Parametry |
Popis |
|---|---|
|
Počet bajtů k přijetí. Funkce |
|
Volitelné. Jak dlouho v milisekundách |
Kód pro robota 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)Kód pro Robota 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 registruje funkci, která má být volána vždy, když V5 Brain přijme sériová data.
Usage:
link.received(callback)
Parametry |
Popis |
|---|---|
|
Dříve definovaná function, která se provede, když V5 Brain přijme sériová data. |
received zpětných volání je voláno se dvěma argumenty:
Podpis zpětného volání:
callback(buffer, length)
Argument |
Popis |
|---|---|
|
Pole bajtů o velikosti |
|
Počet platných bajtů přijatých v |
Kód pro robota 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")Kód pro Robota 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)