Σειριακός σύνδεσμος#
Εισαγωγή#
Το SerialLink επιτρέπει σε δύο εγκεφάλους EXP να επικοινωνούν στέλνοντας και λαμβάνοντας ακατέργαστα σειριακά δεδομένα μέσω του VEX Link. Αντί για μηνύματα με ετικέτες, το SerialLink μεταδίδει ένα buffer (μια συμβολοσειρά ή ένα bytearray). Αυτό το καθιστά χρήσιμο για προηγμένη επικοινωνία μεταξύ ρομπότ, όπως ροή δεδομένων αισθητήρων, αποστολή προσαρμοσμένων μορφών πακέτων ή δημιουργία του δικού σας πρωτοκόλλου πάνω από bytes.
Κάθε χρήση του αποστολή προσθέτει δεδομένα στο buffer λήψης του συνδεδεμένου EXP Brain. Τα δεδομένα διαβάζονται με τη σειρά που φτάνουν (πρώτο εισερχόμενο, πρώτο εξερχόμενο). Εάν αποσταλούν πολλά buffer πριν το άλλο EXP Brain χρησιμοποιήσει το λήψη, αυτά παραμένουν σε ουρά και επιστρέφονται ένα κάθε φορά με τη σειρά που στάλθηκαν. Επειδή τα δεδομένα μπορούν να περιέλθουν σε ουρά, η επαναλαμβανόμενη αποστολή μεγάλων buffer σε κάθε βρόχο μπορεί να δημιουργήσει συσσώρευση δεδομένων. Για κρίσιμους χρονικά συνδέσμους, στείλτε μόνο ό,τι χρειάζεστε.
Σημαντικό: Και τα δύο ρομπότ πρέπει να εκτελούν έργα που χρησιμοποιούν SerialLink ταυτόχρονα, διαφορετικά δεν θα αποστέλλονται/λαμβάνονται δεδομένα.
Αυτή η σελίδα χρησιμοποιεί το link ως παράδειγμα ονόματος SerialLink το με το δικό σας διαμορφωμένο όνομα, όπως απαιτείται.
Παρακάτω είναι μια λίστα με τις διαθέσιμες μεθόδους:
is_linked – Επιστρέφει εάν αυτός ο Εγκέφαλος είναι ενεργά συνδεδεμένος με τον συζευγμένο Εγκέφαλό του.
αποστολή – Στέλνει ένα σύντομο μήνυμα (με προαιρετικά δεδομένα int/float) στον ζευγαρωμένο εγκέφαλο.
λήψη – Περιμένει και επιστρέφει το επόμενο εισερχόμενο μήνυμα.
received – Καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που λαμβάνεται ένα νέο μήνυμα.
Δημιουργία συνδέσμου#
Δημιουργήστε μια Σειριακή Σύνδεση και στους δύο εγκεφάλους EXP για να δημιουργήσετε ένα κανάλι επικοινωνίας μεταξύ τους —είτε ασύρματα με τα V5 Robot Radios είτε μέσω ενός ενσύρματου Smart Cable— ώστε τα ρομπότ να μπορούν να στέλνουν ακατέργαστα σειριακά δεδομένα μεταξύ τους.
SerialLink(smartport, name, linktype, wired)
Παράμετρος
Περιγραφή
smartport
Η Έξυπνη Θύρα που χρησιμοποιείται για αυτήν τη σύνδεση—η θύρα στην οποία είναι συνδεδεμένο το Ρομποτικό Ραδιόφωνο V5 (ασύρματα) ή στην οποία είναι συνδεδεμένο το Έξυπνο Καλώδιο (ενσύρματα). Γράφεται ως Θύρες.PORTx όπου x είναι ο αριθμός θύρας.
name
Το μοναδικό όνομα που θα δοθεί σε αυτόν τον σύνδεσμο ως συμβολοσειρά.
Σημείωση: Αυτό το όνομα πρέπει να είναι αρκετά μεγάλο για να δημιουργήσει ένα μοναδικό αναγνωριστικό, ώστε να μην ταιριάζει κατά λάθος με τον σύνδεσμο άλλης ομάδας.
linktype
Ο ρόλος που θα χρησιμοποιήσει αυτός ο εγκέφαλος για αυτό το ζεύγος συνδέσμων. Κάθε ζεύγος πρέπει να περιλαμβάνει έναν Διευθυντή και έναν Εργαζόμενο:
VexlinkType.MANAGER – Χρησιμοποιείται για το ρομπότ που θα στέλνει περισσότερα ή μεγαλύτερα μηνύματα. Οι διαχειριστές έχουν υψηλότερο εύρος ζώνης εξερχόμενων δεδομένων (~1040 bytes/sec).VexlinkType.WORKER – Χρησιμοποιείται για το ρομπότ που θα στέλνει λιγότερα ή μικρότερα μηνύματα. Οι εργαζόμενοι έχουν χαμηλότερο εύρος ζώνης εξερχόμενων δεδομένων (~520 bytes/sec).
wired
Προαιρετικό. Είτε αυτή η σύνδεση είναι ενσύρματη είτε ασύρματη:
Σωστό – Οι εγκέφαλοι EXP συνδέονται μέσω ενός έξυπνου καλωδίου.Λάθος (προεπιλογή) – Οι εγκέφαλοι EXP συνδέονται ασύρματα χρησιμοποιώντας ρομποτικά ραδιόφωνα V5.
Κωδικός για το Ρομπότ 1
"""
Create a wireless link in Port 1
name: VEXRoboticsLink123456789
linktype: Manager
"""
link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)
Κωδικός για το Ρομπότ 2
"""
Create a wireless link in Port 1
name: VEXRoboticsLink123456789
linktype: Worker
"""
link = SerialLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Διαθέσιμες μέθοδοι#
Μόλις ρυθμιστεί το SerialLink και συνδεθούν οι Brains, μπορείτε να χρησιμοποιήσετε τις παρακάτω μεθόδους για να στέλνετε, να λαμβάνετε και να απαντάτε σε ακατέργαστα σειριακά δεδομένα.
is_linked#
Η μέθοδος is_linked επιστρέφει εάν οι εγκέφαλοι EXP σε ένα SerialLink είναι ζευγαρωμένοι μεταξύ τους.
Σωστό – Οι δύο εγκέφαλοι EXP είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.
Λάθος – Οι δύο εγκέφαλοι EXP δεν είναι ζευγαρωμένοι σε αυτόν τον σύνδεσμο.
Σημείωση: Είναι καλή πρακτική να ελέγχετε πάντα για να βεβαιωθείτε ότι οι εγκέφαλοι EXP είναι συνδεδεμένοι στην αρχή ενός έργου πριν από την εκτέλεση οποιουδήποτε περαιτέρω κώδικα.
Usage:
link.is_linked()
Παράμετροι
Περιγραφή
Αυτή η μέθοδος δεν έχει παραμέτρους.
Κωδικός για το Ρομπότ 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")
Κωδικός για το Ρομπότ 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#
στέλνει μεταδίδει ακατέργαστα σειριακά bytes στον άλλο συνδεδεμένο εγκέφαλο EXP.
Κατά την ανάγνωση αυτών των δεδομένων με receive, η συνάρτηση receive θα επιστρέψει μόνο αφού συλλέξει τον αριθμό των byte που καθορίζεται από την παράμετρο length Εξαιτίας αυτού, εάν ο κώδικάς σας καλεί πάντα receive με σταθερό μήκος , θα πρέπει να βεβαιωθείτε ότι κάθε μήνυμα που αποστέλλεται με send έχει ακριβώς τόσα byte (συχνά με συμπλήρωση), ώστε ο παραλήπτης να μην μπλοκάρει περιμένοντας επιπλέον byte.
Αν δεν θέλετε να βασίζεστε σε έναν ακριβή αριθμό byte, χρησιμοποιήστε την received. Σας επιτρέπει να χειρίζεστε όποια byte είναι διαθέσιμα χωρίς να απαιτείται συγκεκριμένο μήκος.
Usage:
send(buffer)
Παράμετροι
Περιγραφή
buffer
Τα δεδομένα που θα σταλούν στον άλλο συνδεδεμένο εγκέφαλο EXP. Αυτά μπορεί να είναι μια συμβολοσειρά ή ένας πίνακας bytearray .
Κωδικός για το Ρομπότ 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")
Κωδικός για το Ρομπότ 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 επιστρέφει σειριακά δεδομένα από τον άλλο συνδεδεμένο εγκέφαλο EXP με σειρά FIFO (πρώτα τα παλαιότερα μη αναγνωσμένα δεδομένα).
Επειδή receive περιμένει έναν ακριβή αριθμό byte, η ανταλλαγή μηνυμάτων σταθερού μήκους συχνά απαιτεί συμπλήρωση όταν χρησιμοποιείται η εντολή send , έτσι ώστε κάθε μήνυμα να φτάσει στο αναμενόμενο μέγεθος. Εάν ο αποστολέας μεταδώσει λιγότερα από byte μήκους , receive θα συνεχίσει να περιμένει τα υπόλοιπα byte και δεν θα επιστρέψει τίποτα.
Εάν η ουρά είναι κενή και παρέχετε χρονικό όριο , receive περιμένει έως και τόσα χιλιοστά του δευτερολέπτου για νέα δεδομένα. Εάν δεν φτάσει τίποτα σε αυτό το παράθυρο, επιστρέφει None. Οποιαδήποτε δεδομένα αποστέλλονται στη συνέχεια παραμένουν στην ουρά για ανάγνωση αργότερα.
Usage:
receive(length, timeout)
Παράμετροι
Περιγραφή
length
Ο αριθμός των byte προς λήψη. Η εντολή receive περιμένει μέχρι να φτάσουν τόσα πολλά byte και στη συνέχεια τα επιστρέφει ως πίνακα bytearray Εάν το μήκος είναι 0, receive επιστρέφει αμέσως None Εάν ζητήσετε περισσότερα byte από όσα μεταδίδει ο αποστολέας, η εντολή receive θα συνεχίσει να περιμένει. Εάν ο αποστολέας μεταδώσει περισσότερα από αυτό, το επιστρεφόμενο buffer περιορίζεται σε μήκος byte.
timeout
Προαιρετικό. Πόσο χρόνο σε χιλιοστά του δευτερολέπτου θα λάβει το θα περιμένει ένα νέο μήνυμα μόνο εάν η ουρά είναι κενή. Η προεπιλογή είναι 300000 (300 δευτερόλεπτα).
Κωδικός για το Ρομπότ 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)
Κωδικός για το Ρομπότ 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 καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που ο εγκέφαλος EXP λαμβάνει σειριακά δεδομένα.
Usage:
link.received(callback)
Παράμετροι
Περιγραφή
callback
Μια προηγουμένως καθορισμένη συνάρτηση που εκτελείται όταν ο εγκέφαλος EXP λαμβάνει σειριακά δεδομένα.
Οι επανακλήσεις received καλούνται με δύο ορίσματα:
Υπογραφή επανάκλησης:
επανάκληση (buffer, μήκος)
Επιχείρημα
Περιγραφή
buffer
Ένα bytearray που περιέχει τα ληφθέντα σειριακά δεδομένα. Το bytearray μπορεί να είναι μεγαλύτερο από το ληφθέν μήνυμα.
length
Ο αριθμός των έγκυρων byte που ελήφθησαν στο buffer για αυτήν την επανάκληση. Χρησιμοποιήστε το buffer[:length] για πρόσβαση στα δεδομένα που ελήφθησαν.
Κωδικός για το Ρομπότ 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")
Κωδικός για το Ρομπότ 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)