Sarjalinkki#
Johdanto#
SerialLinkin avulla kaksi EXP 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 EXP Brainin vastaanottopuskuriin. Data luetaan saapumisjärjestyksessä (ensimmäinen sisään, ensimmäinen ulos). Jos useita puskureita lähetetään ennen kuin toinen EXP 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 EXP-aivoihin 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 EXP-aivot paritettuja toisiinsa.
True– Kaksi EXP-aivoa on paritettu ja kommunikoivat keskenään tämän linkin kautta.False– Kahta EXP-aivoa ei ole yhdistetty tällä linkillä.
Huom: On hyvä käytäntö tarkistaa aina projektin alussa, että EXP-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ää raakat sarjamuotoiset tavut toiseen linkitettyyn EXP 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 EXP 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ä EXP 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 EXP Brain vastaanottaa sarjadataa.
Usage:
link.received(callback)
Parametrit |
Kuvaus |
|---|---|
|
Aiemmin määritelty function, joka suoritetaan, kun EXP 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)