Seriālā saite#
Ievads#
SerialLink ļauj divām EXP smadzenēm sazināties, nosūtot un saņemot neapstrādātus seriālos datus, izmantojot VEX Link. Marķētu ziņojumu vietā SerialLink pārraida buferi (virkni vai baitu masīvu). Tas padara to noderīgu progresīvai robotu savstarpējai saziņai, piemēram, sensoru datu straumēšanai, pielāgotu pakešu formātu sūtīšanai vai sava protokola izveidei, izmantojot baitus.
Katru reizi, kad tiek izmantota send, saistītā EXP Brain saņemšanas buferī tiek pievienoti dati. Dati tiek nolasīti to piegādes secībā (pirmais ienāk, pirmais ārā). Ja pirms otra EXP Brain izmanto receive, tiek nosūtīti vairāki buferi, tie paliek rindā un tiek atgriezti pa vienam tādā secībā, kādā tie tika nosūtīti. Tā kā dati var tikt ievietoti rindā, atkārtota lielu buferu sūtīšana katrā ciklā var radīt uzkrāšanos; laika ziņā kritiskām saitēm nosūtiet tikai to, kas jums nepieciešams.
Svarīgi: Abiem robotiem vienlaikus jādarbojas projektos, kas izmanto SerialLink , pretējā gadījumā dati netiks nosūtīti/saņemti.
Šajā lapā kā piemēra SerialLink nosaukums tiek izmantots link Ja nepieciešams, nomainiet to ar savu konfigurēto nosaukumu.
Zemāk ir pieejamo metožu saraksts:
is_linked– Atgriež, vai šīs smadzenes ir aktīvi savienotas ar pārī savienotajām smadzenēm.send– Nosūta īsu ziņojumu (ar papildu int/float datiem) pārī savienotajām smadzenēm.receive– Gaida un atgriež nākamo ienākošo ziņojumu.received– Reģistrē funkciju, kas tiks izsaukta ikreiz, kad tiek saņemts jauns ziņojums.
Izveidot saiti#
Izveidojiet seriālo saiti abās EXP smadzenēs, lai izveidotu saziņas kanālu starp tām — vai nu bezvadu režīmā ar V5 robotu radio, vai izmantojot vadu viedkabeli —, lai roboti varētu viens otram sūtīt neapstrādātus seriālos datus.
SerialLink(smartport, name, linktype, wired)
Parametrs |
Apraksts |
|---|---|
|
Šai saitei izmantotā viedā pieslēgvieta — pieslēgvieta, kurai ir pievienots V5 robota radio (bezvadu savienojums) vai kurai ir pievienots viedais kabelis (vadu savienojums). Rakstīts kā |
|
Unikālais nosaukums, kas šai saitei jāpiešķir kā virkne. |
|
Loma, ko šīs smadzenes izmantos šim saišu pārim. Katrā pārī jāiekļauj viens vadītājs un viens darbinieks:
|
|
Pēc izvēles. Vai šī saite ir vadu vai bezvadu:
|
1. robota kods
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robots 2 kods
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Pieejamās metodes#
Kad jūsu SerialLink ir iestatīts un smadzenes ir savienotas, varat izmantot tālāk norādītās metodes, lai nosūtītu, saņemtu un atbildētu uz neapstrādātiem sērijas datiem.
is_linked#
is_linked metode atgriež, vai EXP smadzenes seriālajā saitē ir savienotas pārī viena ar otru.
True– Abas EXP smadzenes ir savienotas pārī un sazinās, izmantojot šo saiti.False– Abas EXP smadzenes šajā saitē nav savienotas pārī.
Piezīme: Pirms jebkāda turpmāka koda palaišanas projekta sākumā vienmēr ir jāpārbauda, vai EXP smadzenes ir saistītas.
Usage:
link.is_linked()
Parametri |
Apraksts |
|---|---|
Šai metodei nav parametru. |
1. robota kods
# 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")Robots 2 kods
# 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 pārraida neapstrādātus seriālos baitus uz otru saistīto EXP Brain.
When reading that data with receive, receive will only return once it has collected the number of bytes specified by its length parameter. Because of that, if your code always calls receive with a fixed length, you should ensure each message sent with send is exactly that many bytes (often by padding) so the receiver doesn’t block waiting for additional bytes.
Ja nevēlaties paļauties uz precīzu baitu skaitu, izmantojiet received; tas ļauj apstrādāt visus pieejamos baitus, nepieprasot konkrētu garumu.
Usage:
send(buffer)
Parametri |
Apraksts |
|---|---|
|
Dati, kas jānosūta uz otru saistīto EXP Brain. Tā var būt |
1. robota kods
# 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")Robots 2 kods
# 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 atgriež sērijas datus no otras saistītās EXP Brain FIFO secībā (vispirms vecākie nelasītie dati).
Tā kā receive gaida precīzu baitu skaitu, fiksēta garuma ziņojumapmaiņai, izmantojot send , bieži ir nepieciešama papildināšana, lai katrs ziņojums sasniegtu paredzēto izmēru. Ja sūtītājs pārsūta mazāk nekā length baitus, receive turpinās gaidīt atlikušos baitus un neko neatgriezīs.
Ja rinda ir tukša un jūs norādāt taimautu timeout, receive gaida jaunus datus līdz norādītajam milisekundēm. Ja šajā logā nekas neierodas, tā atgriež vērtību None. Visi pēc tam nosūtītie dati paliek rindā, lai tos nolasītu vēlāk.
Usage:
receive(length, timeout)
Parametri |
Apraksts |
|---|---|
|
Saņemamo baitu skaits. |
|
Neobligāti. Cik ilgi milisekundēs |
1. robota kods
# 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)Robots 2 kods
# 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 reģistrē funkciju, kas tiks izsaukta ikreiz, kad EXP Brain saņems seriālos datus.
Usage:
link.received(callback)
Parametri |
Apraksts |
|---|---|
|
Iepriekš definēta funkcija, kas tiek izpildīta, kad EXP Brain saņem seriālos datus. |
received atzvanīšanas signāli tiek izsaukti ar diviem argumentiem:
Atzvanīšanas paraksts:
callback(buffer, length)
Arguments |
Apraksts |
|---|---|
|
|
|
The number of valid bytes received in |
1. robota kods
# 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")Robots 2 kods
# 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)