Σειριακός σύνδεσμος#
Εισαγωγή#
Το SerialLink επιτρέπει σε δύο εγκεφάλους EXP να επικοινωνούν στέλνοντας και λαμβάνοντας ακατέργαστα σειριακά δεδομένα μέσω του VEX Link. Αντί για μηνύματα με ετικέτες, το SerialLink μεταδίδει ένα buffer (μια συμβολοσειρά ή ένα bytearray). Αυτό το καθιστά χρήσιμο για προηγμένη επικοινωνία μεταξύ ρομπότ, όπως ροή δεδομένων αισθητήρων, αποστολή προσαρμοσμένων μορφών πακέτων ή δημιουργία του δικού σας πρωτοκόλλου πάνω από bytes.
Κάθε χρήση του send προσθέτει δεδομένα στο buffer λήψης του συνδεδεμένου EXP Brain. Τα δεδομένα διαβάζονται με τη σειρά που φτάνουν (πρώτο εισερχόμενο, πρώτο εξερχόμενο). Εάν αποσταλούν πολλά buffer πριν το άλλο EXP Brain χρησιμοποιήσει το receive, αυτά παραμένουν σε ουρά και επιστρέφονται ένα κάθε φορά με τη σειρά που στάλθηκαν. Επειδή τα δεδομένα μπορούν να περιέλθουν σε ουρά, η επαναλαμβανόμενη αποστολή μεγάλων buffer σε κάθε βρόχο μπορεί να δημιουργήσει συσσώρευση δεδομένων. Για κρίσιμους χρονικά συνδέσμους, στείλτε μόνο ό,τι χρειάζεστε.
Σημαντικό: Και τα δύο ρομπότ πρέπει να εκτελούν έργα που χρησιμοποιούν SerialLink ταυτόχρονα, διαφορετικά δεν θα αποστέλλονται/λαμβάνονται δεδομένα.
Αυτή η σελίδα χρησιμοποιεί το link ως παράδειγμα ονόματος SerialLink το με το δικό σας διαμορφωμένο όνομα, όπως απαιτείται.
Παρακάτω είναι μια λίστα με τις διαθέσιμες μεθόδους:
is_linked– Επιστρέφει εάν αυτός ο Εγκέφαλος είναι ενεργά συνδεδεμένος με τον συζευγμένο Εγκέφαλό του.send– Στέλνει ένα σύντομο μήνυμα (με προαιρετικά δεδομένα int/float) στον ζευγαρωμένο εγκέφαλο.receive– Περιμένει και επιστρέφει το επόμενο εισερχόμενο μήνυμα.received– Καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που λαμβάνεται ένα νέο μήνυμα.
Δημιουργία συνδέσμου#
Δημιουργήστε μια Σειριακή Σύνδεση και στους δύο εγκεφάλους EXP για να δημιουργήσετε ένα κανάλι επικοινωνίας μεταξύ τους —είτε ασύρματα με τα V5 Robot Radios είτε μέσω ενός ενσύρματου Smart Cable— ώστε τα ρομπότ να μπορούν να στέλνουν ακατέργαστα σειριακά δεδομένα μεταξύ τους.
SerialLink(smartport, name, linktype, wired)
Παράμετρος |
Περιγραφή |
|---|---|
|
Η Έξυπνη Θύρα που χρησιμοποιείται για αυτήν τη σύνδεση—η θύρα στην οποία είναι συνδεδεμένο το Ρομποτικό Ραδιόφωνο 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 είναι ζευγαρωμένοι μεταξύ τους.
True– Οι δύο εγκέφαλοι EXP είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.False– Οι δύο εγκέφαλοι 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#
send μεταδίδει ακατέργαστα σειριακά bytes στον άλλο συνδεδεμένο εγκέφαλο EXP.
Κατά την ανάγνωση αυτών των δεδομένων με receive, η συνάρτηση receive θα επιστρέψει μόνο αφού συλλέξει τον αριθμό των byte που καθορίζεται από την παράμετρο length Εξαιτίας αυτού, εάν ο κώδικάς σας καλεί πάντα receive με σταθερό μήκος length, θα πρέπει να βεβαιωθείτε ότι κάθε μήνυμα που αποστέλλεται με send έχει ακριβώς τόσα byte (συχνά με συμπλήρωση), ώστε ο παραλήπτης να μην μπλοκάρει περιμένοντας επιπλέον byte.
Αν δεν θέλετε να βασίζεστε σε έναν ακριβή αριθμό byte, χρησιμοποιήστε την received. Σας επιτρέπει να χειρίζεστε όποια byte είναι διαθέσιμα χωρίς να απαιτείται συγκεκριμένο μήκος.
Usage:
send(buffer)
Παράμετροι |
Περιγραφή |
|---|---|
|
Τα δεδομένα που θα σταλούν στον άλλο συνδεδεμένο εγκέφαλο EXP. Αυτά μπορεί να είναι μια συμβολοσειρά |
Κωδικός για το Ρομπότ 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 , έτσι ώστε κάθε μήνυμα να φτάσει στο αναμενόμενο μέγεθος. Εάν ο αποστολέας μεταδώσει λιγότερα από length , receive θα συνεχίσει να περιμένει τα υπόλοιπα byte και δεν θα επιστρέψει τίποτα.
Εάν η ουρά είναι κενή και παρέχετε χρονικό όριο timeout, receive περιμένει έως και τόσα χιλιοστά του δευτερολέπτου για νέα δεδομένα. Εάν δεν φτάσει τίποτα σε αυτό το παράθυρο, επιστρέφει None. Οποιαδήποτε δεδομένα αποστέλλονται στη συνέχεια παραμένουν στην ουρά για ανάγνωση αργότερα.
Usage:
receive(length, timeout)
Παράμετροι |
Περιγραφή |
|---|---|
|
The number of bytes to receive. |
|
Προαιρετικό. Πόσο χρόνο σε χιλιοστά του δευτερολέπτου θα λάβει το |
Κωδικός για το Ρομπότ 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)
Παράμετροι |
Περιγραφή |
|---|---|
|
Μια προηγουμένως καθορισμένη συνάρτηση που εκτελείται όταν ο εγκέφαλος EXP λαμβάνει σειριακά δεδομένα. |
Οι επανακλήσεις received καλούνται με δύο ορίσματα:
Υπογραφή επανάκλησης:
callback(buffer, length)
Επιχείρημα |
Περιγραφή |
|---|---|
|
Ένα bytearray |
|
Ο αριθμός των έγκυρων byte που ελήφθησαν στο |
Κωδικός για το Ρομπότ 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)