Sarjalinkki#
Johdanto#
SerialLinkin avulla kaksi V5 Brainia kommunikoi lähettämällä ja vastaanottamalla raakaa sarjadataa VEX Linkin kautta. Merkittyjen viestien sijaan SerialLink lähettää puskurin (merkkijonon tai tavutaulukon). Tämä tekee siitä hyödyllisen edistyneessä robottien välisessä viestinnässä, kuten anturidatan suoratoistossa, mukautettujen pakettimuotojen lähettämisessä tai oman protokollan rakentamisessa tavujen päälle.
Jokainen send-käskyn käyttökerta lisää dataa linkitetyn V5 Brainin vastaanottopuskuriin. Data luetaan saapumisjärjestyksessä (ensimmäinen sisään, ensimmäinen ulos). Jos useita puskureita lähetetään ennen kuin toinen V5 Brain käyttää receive-käskyä, ne pysyvät jonossa ja palautetaan yksi kerrallaan lähetysjärjestyksessä. Koska data voi jonottaa, suurten puskurien toistuva lähettäminen jokaisessa silmukassa voi luoda ruuhkan; aikakriittisissä linkeissä lähetä vain tarvitsemasi.
Tärkeää: Molempien robottien on oltava käynnissä projekteissa, jotka käyttävät SerialLink tä samanaikaisesti, muuten dataa ei lähetetä/vastaanoteta.
Tällä sivulla käytetään esimerkkinä nimeä link ja SerialLink nimeä 2. Korvaa se tarvittaessa omalla määritetyllä nimelläsi.
Alla on luettelo käytettävissä olevista menetelmistä:
is_linked– Palauttaa, onko tämä aivo aktiivisesti yhteydessä siihen paritettuun aivoon.send– Lähettää lyhytviestin (valinnaisella kokonaisluku-/liukulukudatalla) parilliselle aivoille.receive– Odottaa seuraavaa saapuvaa viestiä ja palauttaa sen.received– Rekisteröi funktion kutsuttavaksi aina, kun uusi viesti vastaanotetaan.
Luo linkki#
Luo sarjaliikennelinkki molempiin V5 Brain -laitteisiin muodostaaksesi niiden välille kommunikaatiokanavan – joko langattomasti V5-robottiradioiden avulla tai langallisen älykaapelin kautta – jotta robotit voivat lähettää raakasarjadataa toisilleen.
SerialLink(smartport, name, linktype, wired)
Parametri |
Kuvaus |
|---|---|
|
Tässä linkissä käytetty älyportti – portti, johon V5-robottiradio on kytketty (langaton) tai johon älykaapeli on kytketty (langallinen). Kirjoitetaan muodossa |
|
Linkin yksilöllinen nimi merkkijonona. |
|
Rooli, jota tämä aivo käyttää tälle linkkiparille. Jokaisen parin on sisällettävä yksi johtaja ja yksi työntekijä:
|
|
Valinnainen. Onko tämä yhteys langallinen vai langaton:
|
Robotin 1 koodi
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robotin 2 koodi
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Käytettävissä olevat menetelmät#
Kun SerialLink on määritetty ja aivot on linkitetty, voit käyttää alla olevia menetelmiä raakasarjadatan lähettämiseen, vastaanottamiseen ja siihen vastaamiseen.
is_linked#
is_linked -metodi palauttaa, ovatko sarjalinkin V5-aivot paritettuja toisiinsa.
True– Kaksi V5-aivoa on yhdistetty ja kommunikoivat keskenään tämän linkin kautta.False– Kahta V5-aivoa ei ole yhdistetty tällä linkillä.
Huomautus: On hyvä käytäntö tarkistaa aina projektin alussa, että V5-aivot on linkitetty ennen minkään muun koodin suorittamista.
Usage:
link.is_linked()
Parametrit |
Kuvaus |
|---|---|
Tällä menetelmällä ei ole parametreja. |
Robotin 1 koodi
# 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")Robotin 2 koodi
# 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 lähettää raakasarjatavut toiseen linkitettyyn V5 Brainiin.
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.
Jos et halua olla riippuvainen tarkasta tavumäärästä, käytä sen sijaan funktiota received; se antaa sinun käsitellä kaikki käytettävissä olevat tavut ilman tiettyä pituutta.
Usage:
send(buffer)
Parametrit |
Kuvaus |
|---|---|
|
Toiseen linkitettyyn V5 Brainiin lähetettävä data. Tämä voi olla |
Robotin 1 koodi
# 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")Robotin 2 koodi
# 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 palauttaa sarjadatan toisesta linkitetystä V5 Brainista FIFO-järjestyksessä (vanhin lukematon data ensin).
Koska receive odottaa tarkkaa tavumäärää, kiinteän pituiset viestit vaativat usein täyttöä käytettäessä send , jotta jokainen viesti saavuttaa odotetun koon. Jos lähettäjä lähettää alle length tavua, receive jatkaa odottamista jäljellä oleviin tavuihin eikä palauta mitään.
Jos jono on tyhjä ja annat aikakatkaisuksi timeout, receive odottaa uutta dataa niin monta millisekuntia. Jos kyseiseen ikkunaan ei saavu mitään, se palauttaa arvon None. Tämän jälkeen lähetetyt tiedot pysyvät jonossa myöhempää luettavaa varten.
Usage:
receive(length, timeout)
Parametrit |
Kuvaus |
|---|---|
|
Vastaanotettavien tavujen määrä. |
|
Valinnainen. Kuinka kauan millisekunteina |
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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 rekisteröi funktion kutsuttavaksi aina, kun V5 Brain vastaanottaa sarjadataa.
Usage:
link.received(callback)
Parametrit |
Kuvaus |
|---|---|
|
Aiemmin määritelty function, joka suoritetaan, kun V5 Brain vastaanottaa sarjadataa. |
received takaisinkutsufunktioita kutsutaan kahdella argumentilla:
Takaisinkutsun allekirjoitus:
callback(buffer, length)
Argumentti |
Kuvaus |
|---|---|
|
|
|
Tässä takaisinkutsussa vastaanotettujen kelvollisten tavujen määrä puskurissa |
Robotin 1 koodi
# 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")Robotin 2 koodi
# 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)