Βασισμένο στο «Processing Strings on Arduino. Αντικείμενο και σειριακές εντολές Arduino String

Ηλεκτρονική 01.06.2019

Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει... έξυπνο σπίτι», σκέφτηκα ότι η έκδοση εντολών από τον υπολογιστή θα ήταν το πιο δύσκολο κομμάτι - πρέπει να αποδεχτείτε μια συμβολοσειρά από σειριακή θύρα, αναγνωρίστε το, βεβαιωθείτε ότι δεν υπάρχουν σφάλματα... Ωστόσο, αποδείχθηκε ότι ήταν αρκετό να διαβάσετε τον ιστότοπο Arduino.cc και να δοκιμάσετε μερικά παραδείγματα, καθώς έγινε σαφές ότι οι προγραμματιστές προσπάθησαν να μας προστατεύσουν από το να γράφουμε πολύ και βαρετός κώδικας. Παρεμπιπτόντως, τελικά ολοκλήρωσα την εργασία το βράδυ, στο τέλος σκέφτηκα: "τι άλλη εντολή θα μπορούσα να προσθέσω;..."

Λοιπόν, ας υποθέσουμε ότι γνωρίζετε ήδη πώς να προγραμματίζετε το Arduino και μπορείτε να κατανοήσετε τον δικό σας κώδικα ή τον κώδικα κάποιου άλλου. Μία από τις βασικές έννοιες είναι οι μεταβλητές και οι τύποι τους. Λοιπόν, παράνομα; byte, int, long, char, string... Τα δύο τελευταία είναι ουσιαστικά το ίδιο πράγμα, γιατί η συμβολοσειρά είναι ένας πίνακας μεταβλητές τύπου char (κάποιος μπορεί τώρα να υποστηρίξει ότι το char αντιπροσωπεύεται ως ένας αριθμός byte, αλλά δεν είναι αυτό το θέμα). Έτσι, όλα όσα λαμβάνονται από τη σειριακή θύρα θα πρέπει να διαβάζονται ως char:

Char inChar = " "; byte z = 0; ενώ (Serial.available()) (inChar[z] = Serial.read(); z++; )

Αυτό είναι το πρώτο παράδειγμα που μπορεί να μου έρθει στο μυαλό. Δημιουργούμε μια κενή γραμμή και, στη συνέχεια, αν υπάρχει κάτι να διαβάσουμε από τη σειριακή θύρα, τη γεμίζουμε χαρακτήρα προς χαρακτήρα. Η συνάρτηση Serial.available() επιστρέφει τον αριθμό των byte που είναι διαθέσιμα για ανάγνωση και αν είναι κενό, τότε προφανώς 0. Αυτό μπορεί να χρησιμοποιηθεί για να μάθουμε το μήκος της δεδομένης εντολής, αν και το γνωρίζουμε ήδη στο παράδειγμα που δίνεται - αυτή είναι η τιμή της μεταβλητής z στην έξοδο από τον βρόχο. Ναι, μια σειρά από κενά (κωδικός διαστήματος ASCII - όχι μηδέν!) είναι ανεκτή, αλλά εξακολουθεί να μην είναι πολύ καλή, αποφύγετε αυτό εάν είναι δυνατόν. Και ένας γρήγορος αναγνώστης θα μπορέσει να επαινέσει τον εαυτό του αν μαντέψει αμέσως τι πρέπει να διορθωθεί στον παραπάνω κώδικα. Για όσους δεν μάντεψαν, μια υπόδειξη: το char inchar είναι μια συμβολοσειρά 6 χαρακτήρων. Εάν σε μια συμβολοσειρά εκχωρηθεί μια τιμή, ο μεταγλωττιστής σάς επιτρέπει να αποφύγετε να προσδιορίσετε ρητά το μήκος της, έτσι στο παράδειγμα αγκύλεςαδειάζω.

Παρεμπιπτόντως, μην ξεχάσετε να γράψετε στο setup()

Serial.begin(9600);

Και στην ενσωματωμένη οθόνη θύρας, στην οποία, στην πραγματικότητα, θα σταλούν εντολές, καθορίστε την ταχύτητα - 9600 baud, διαφορετικά θα δείτε ρωγμές.

Στη συνέχεια, τι να κάνετε με τη συμβολοσειρά που προκύπτει; Όσοι προτείνουν να συγκρίνουν μια συμβολοσειρά byte-byte με γνωστές τιμές (και μια τέτοια ιδέα μπορεί σίγουρα να προκύψει σε κάποιον) μετά την ανάγνωση του άρθρου θα προχωρήσουν στο χρόνο κατά 20 χρόνια, εννοώ.

Αναζήτηση τεκμηρίωσης Arduino IDEδίνει δύο επιλογές για το τι είναι η συμβολοσειρά. Αυτή είναι η ίδια η συμβολοσειρά ως μια συμβολοσειρά χαρακτήρων, και η συμβολοσειρά, η οποία είναι ένα αντικείμενο εικονικό χώρο, έχοντας μια ορισμένη κατάσταση και συμπεριφορά, έχοντας ορίσετε τιμέςιδιότητες (χαρακτηριστικά) και πράξεις σε αυτά (μέθοδοι)". Με άλλα λόγια, μια μεταβλητή με ενσωματωμένες συναρτήσεις που κάνουν κάτι με αυτήν τη μεταβλητή. Για να ξεκινήσετε να εργάζεστε με αυτό το αντικείμενο, ας γράψουμε κάτι σαν αυτό:

Εισαγωγή συμβολοσειράς = ""; ενώ (Serial.available()) ( input += Serial.read(); )

Εδώ, όλο και περισσότεροι νέοι χαρακτήρες θα προστίθενται στην είσοδο μέχρι να εξαντληθεί το buffer. Στη συνέχεια, θα είναι δυνατή η ανάλυση της συμβολοσειράς που προκύπτει, για παράδειγμα, ως εξής:

Input.toLowerCase(); if(input.startsWith("pause")) ( String toWait = input.substring(5); toWait.trim(); int delaytime = toWait.toInt(); if(delaytime>0) ( if(delaytime<10000) { delay(delaytime); } } }

Ο κώδικας χρησιμοποιεί πολύ βολικές συναρτήσεις ενσωματωμένες στο αντικείμενο String. Αυτά είναι startsWith(), που επιστρέφει ένα εάν η συμβολοσειρά αρχίζει με αυτό που γράφεται σε αγκύλες, substring(), που επιστρέφει ένα κομμάτι της συμβολοσειράς, ξεκινώντας σε αυτήν την περίπτωση με τον 5ο χαρακτήρα (μετράται ξεκινώντας από το μηδέν), trim() , που απορρίπτει οτιδήποτε περιττό βρίσκεται στις άκρες της γραμμής, και toInt(), που μετατρέπει ό,τι έχει απομείνει σε έναν αριθμό τύπου Int. Είναι επίσης καλή ιδέα να ελέγξετε αυτόν τον αριθμό για να δείτε εάν εμπίπτει στο αναμενόμενο εύρος. Ως αποτέλεσμα, εάν δώσετε την εντολή "PauSe 567", τότε το MK θα περιμένει ακριβώς 567 χιλιοστά του δευτερολέπτου.

Αξίζει να γράψετε ξεχωριστά για το trim(). Χρειάζεται όχι μόνο να απορρίψετε το διάστημα στην αρχή της γραμμής που προκύπτει, αλλά κυρίως για να απαλλαγείτε από τους χαρακτήρες στο τέλος. Αυτοί είναι χαρακτήρες υπηρεσίας που προστίθενται κατά την αποστολή μηνύματος - NL (νέα γραμμή) και CR (επιστροφή μεταφοράς). Χρειάζονται απλώς για να σηματοδοτήσουν το τέλος της εντολής, αλλά μπορούν επίσης να παρεμβαίνουν. Επομένως, παρόλο που η οθόνη της θύρας μπορεί να επιλέξει ποιον από αυτούς τους χαρακτήρες να στείλει ή να μην στείλει τίποτα, είναι καλύτερα να είστε στην ασφαλή πλευρά. Επιπλέον, αυτό γίνεται σε μία γραμμή κώδικα.

Και εδώ είναι η λίστα των συναρτήσεων (μεθόδων) του αντικειμένου String.

    charAt()- επιστρέφει τον χαρακτήρα στην καθορισμένη θέση

    concat()- συνάρτηση συνένωσης, δηλαδή συγχώνευση δύο χορδών σε μία. Είναι αλήθεια ότι το string1 = string1 + string2 είναι το ίδιο με το string1.concat(string1, string2), αλλά γράφεται απλούστερα και πιο καθαρά.

    ίσον ()- επιστρέφει ένα εάν η συμβολοσειρά είναι χαρακτήρας ίση με αυτό που είναι γραμμένο σε παρένθεση. Υπάρχει επίσης η ίση IgnoreCase(), η οποία αγνοεί τα πεζά (πάνω ή κάτω)

    endsWith()- που λειτουργεί παρόμοια με startsWith()

    indexOf()- επιστροφή της θέσης στη συμβολοσειρά του χαρακτήρα (ή της συμβολοσειράς) σε αγκύλες. Ψάχνει από το τέλος και επιστρέφει -1 αν δεν βρεθεί.

    μήκος()- εμφάνιση του μήκους της χορδής

    setCharAt()- Απαιτείται ένα μέρος και ένας χαρακτήρας που πρέπει να τοποθετηθούν σε αυτό το μέρος, για παράδειγμα: string1.setCharAt(3, "d") θα βάλει το d ως τον τρίτο χαρακτήρα στη γραμμή αντί για αυτό που υπήρχε εκεί

  • Και μερικά άλλα που είναι απίθανο να χρειαστείτε αν δεν μπορείτε να πάτε στο arduino.cc και να διαβάσετε γι 'αυτούς :)

Μόνο αυτό ήθελα να σου πω. Ελπίζω αυτό το άρθρο να σας βοηθήσει να μην φοβάστε το OOP και να διδάξετε το ρομπότ του σπιτιού σας στο Arduino να υπακούει στα σήματα από τον υπολογιστή

Οι συμβολοσειρές κειμένου μπορούν να δηλωθούν με δύο τρόπους: μπορείτε να χρησιμοποιήσετε τον τύπο δεδομένων String, ο οποίος περιλαμβάνεται στον πυρήνα από την έκδοση 0019. ή να δηλώσετε τη συμβολοσειρά ως μηδενικό τερματικό πίνακα χαρακτήρων. Αυτή η σελίδα περιγράφει τη δεύτερη μέθοδο. Για περισσότερες πληροφορίες σχετικά με το αντικείμενο String, το οποίο παρέχει περισσότερη λειτουργικότητα με κόστος περισσότερης μνήμης, ανατρέξτε στη σελίδα String Object.

Παραδείγματα

Ακολουθούν παραδείγματα σωστών δηλώσεων συμβολοσειράς.

Char Str1;

char Str2 = ("a", "r", "d", "u", "i", "n", "o");

  • char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");
  • char Str4 = "αρντουίνο";
  • char Str5 = "αρντουίνο";
  • char Str6 = "αρντουίνο";
  • Επιτρεπόμενες λειτουργίες κατά τη δήλωση συμβολοσειρών
  • Δηλώστε έναν πίνακα χαρακτήρων χωρίς να τον αρχικοποιήσετε (Str1)

Δηλώστε έναν πίνακα χαρακτήρων με ένα περιττό στοιχείο, ο ίδιος ο μεταγλωττιστής θα προσθέσει τον απαιτούμενο μηδενικό χαρακτήρα (Str2)

Προσθέστε ρητά μηδενικό χαρακτήρα (Str3)

Ουσιαστικά, αυτό σημαίνει ότι το μήκος της συμβολοσειράς σας θα πρέπει να είναι 1 χαρακτήρα μεγαλύτερο από το κείμενο που θα θέλατε να αποθηκεύσετε σε αυτήν. Αυτός είναι ο λόγος για τον οποίο οι Str2 και Str5 πρέπει να έχουν μήκος 8 χαρακτήρες, παρόλο που η λέξη "arduino" καταλαμβάνει μόνο 7 - η τελευταία θέση συμπληρώνεται αυτόματα με έναν μηδενικό χαρακτήρα. Το μέγεθος του Str4 θα γίνει αυτόματα 8 - ένας χαρακτήρας απαιτείται για τον τερματισμό null. Στη συμβολοσειρά Str3, εμείς οι ίδιοι καθορίσαμε τον μηδενικό χαρακτήρα (που συμβολίζεται με "\0").

Σημειώστε ότι είναι γενικά δυνατό να δηλώσετε μια συμβολοσειρά χωρίς τερματικό μηδενικό χαρακτήρα (για παράδειγμα, εάν ορίσετε το μήκος του Str2 σε 7 αντί για 8). Ωστόσο, αυτό θα σπάσει τις περισσότερες συναρτήσεις συμβολοσειράς, επομένως δεν πρέπει να το κάνετε εσκεμμένα. Αυτό το σφάλμα μπορεί να προκαλέσει παράξενη συμπεριφορά ή εμφάνιση ξένων χαρακτήρων κατά την εργασία με χορδές.

Μονά ή διπλά εισαγωγικά;

Οι συμβολοσειρές δηλώνονται πάντα σε διπλά εισαγωγικά ("Abc") και οι χαρακτήρες δηλώνονται πάντα σε μονά εισαγωγικά ("A").

Αναδίπλωση μακριές γραμμές

Οι μακριές γραμμές μπορούν να τυλιχτούν ως εξής:

Char myString = "Αυτή είναι η πρώτη γραμμή" " αυτή είναι η δεύτερη γραμμή" " etcetera";

Πίνακες συμβολοσειρών

Όταν εργάζεστε με μεγάλες ποσότητες κειμένου (για παράδειγμα, σε έργα που λειτουργούν με οθόνη LCD), είναι συχνά βολικό να χρησιμοποιείτε συστοιχίες συμβολοσειρών. Δεδομένου ότι οι συμβολοσειρές είναι οι ίδιες πίνακες, αυτό είναι ουσιαστικά ένα παράδειγμα ενός δισδιάστατου πίνακα.

Στο παρακάτω πρόγραμμα, ο αστερίσκος μετά τον τύπο δεδομένων char "char*" υποδεικνύει ότι η μεταβλητή είναι ένας πίνακας "δείκτες". Όλα τα ονόματα πινάκων είναι στην πραγματικότητα δείκτες, επομένως ο αστερίσκος είναι απαραίτητος για τη δημιουργία ενός πίνακα πινάκων. Οι δείκτες στο C είναι ένα από τα πιο δύσκολα πράγματα για αρχάριους, αλλά σε αυτήν την περίπτωση, δεν απαιτείται βαθιά κατανόηση των δεικτών για την αποτελεσματική χρήση τους.

Παράδειγμα

char* myStrings=("This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5", "This is string 6"); void setup())( Serial.begin(9600); ) void loop())( for (int i = 0; i< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

Οι συμβολοσειρές κειμένου μπορούν να δηλωθούν με δύο τρόπους: μπορείτε να χρησιμοποιήσετε τον τύπο δεδομένων String, ο οποίος περιλαμβάνεται στον πυρήνα από την έκδοση 0019. ή να δηλώσετε τη συμβολοσειρά ως μηδενικό τερματικό πίνακα χαρακτήρων. Αυτή η σελίδα περιγράφει τη δεύτερη μέθοδο. Για περισσότερες πληροφορίες σχετικά με το αντικείμενο String, το οποίο παρέχει περισσότερη λειτουργικότητα με κόστος περισσότερης μνήμης, ανατρέξτε στη σελίδα String - Object.

Παραδείγματα

Ακολουθούν παραδείγματα σωστών δηλώσεων συμβολοσειράς.

Char Str1;

char Str2 = ("a", "r", "d", "u", "i", "n", "o");

char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");

char Str4 = "αρντουίνο";

char Str5 = "αρντουίνο";

char Str6 = "arduino";

char Str1 [15];

char Str2 = ("a", "r", "d", "u", "i", "n", "o");

  • char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");
  • char Str4 = "αρντουίνο";
  • char Str5 = "αρντουίνο";
  • char Str6 = "αρντουίνο";
  • Επιτρεπόμενες λειτουργίες κατά τη δήλωση συμβολοσειρών
  • Δηλώστε έναν πίνακα χαρακτήρων χωρίς να τον αρχικοποιήσετε (Str1)

Δηλώστε έναν πίνακα χαρακτήρων με ένα περιττό στοιχείο, ο ίδιος ο μεταγλωττιστής θα προσθέσει τον απαιτούμενο μηδενικό χαρακτήρα (Str2)

Προσθέστε ρητά μηδενικό χαρακτήρα (Str3)

char Str2 [ 8 ] = ( "a" , "r" , "d" , "u" , "i" , "n" , "o" );

Σημειώστε ότι είναι γενικά δυνατό να δηλώσετε μια συμβολοσειρά χωρίς τερματικό μηδενικό χαρακτήρα (για παράδειγμα, εάν ορίσετε το μήκος του Str2 σε 7 αντί για 8). Ωστόσο, αυτό θα σπάσει τις περισσότερες συναρτήσεις συμβολοσειράς, επομένως δεν πρέπει να το κάνετε εσκεμμένα. Αυτό το σφάλμα μπορεί να προκαλέσει παράξενη συμπεριφορά ή εμφάνιση ξένων χαρακτήρων κατά την εργασία με χορδές.

Μονά ή διπλά εισαγωγικά;

char Str3 [ 8 ] = ( "a" , "r" , "d" , "u" , "i" , "n" , "o" , "\0" );

Αναδίπλωση μακριές γραμμές

Οι μακριές γραμμές μπορούν να τυλιχτούν ως εξής:

char Str4 = "αρντουίνο" ;

char Str5 [ 8 ] = "αρντουίνο" ;

char Str6 [ 15 ] = "αρντουίνο" ;

Ουσιαστικά, αυτό σημαίνει ότι το μήκος της συμβολοσειράς σας πρέπει να είναι 1 χαρακτήρα μεγαλύτερο από το κείμενο που θα θέλατε να αποθηκεύσετε σε αυτήν. Αυτός είναι ο λόγος για τον οποίο οι Str2 και Str5 πρέπει να έχουν μήκος 8 χαρακτήρες, παρόλο που η λέξη "arduino" καταλαμβάνει μόνο 7 - η τελευταία θέση συμπληρώνεται αυτόματα με έναν μηδενικό χαρακτήρα. Το μέγεθος του Str4 θα γίνει αυτόματα 8 - απαιτείται ένας χαρακτήρας για το μηδενικό τερματικό. Στη συμβολοσειρά Str3, καθορίσαμε ανεξάρτητα τον μηδενικό χαρακτήρα (που συμβολίζεται με '\0').

Πίνακες συμβολοσειρών

Οι συμβολοσειρές δηλώνονται πάντα σε διπλά εισαγωγικά ('Abc'), και οι χαρακτήρες δηλώνονται πάντα σε μονά εισαγωγικά ('A').

char myString = "Αυτή είναι η πρώτη γραμμή" " αυτή είναι η δεύτερη γραμμή" " etcetera";

Παράδειγμα

char myString = "Αυτή είναι η πρώτη γραμμή"< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

"Αυτή είναι η δεύτερη γραμμή"

Οι συμβολοσειρές κειμένου μπορούν να δηλωθούν με δύο τρόπους: μπορείτε να χρησιμοποιήσετε τον τύπο δεδομένων String, ο οποίος περιλαμβάνεται στον πυρήνα από την έκδοση 0019. ή να δηλώσετε τη συμβολοσειρά ως μηδενικό τερματικό πίνακα χαρακτήρων. Αυτή η σελίδα περιγράφει τη δεύτερη μέθοδο. Για περισσότερες πληροφορίες σχετικά με το αντικείμενο String, το οποίο παρέχει περισσότερη λειτουργικότητα με κόστος περισσότερης μνήμης, ανατρέξτε στη σελίδα String - Object.

Παραδείγματα

Ακολουθούν παραδείγματα σωστών δηλώσεων συμβολοσειράς.

Char Str1; char Str2 = ("a", "r", "d", "u", "i", "n", "o"); char Str3 = ("a", "r", "d", "u", "i", "n", "o", "char Str1; char Str2 = ("a", "r", "d ", "u", "i", "n", "o"); char Str3 = ("a", "r", "d", "u", "i", "n", "o" , "\0"); char Str4 = "αρντουίνο"; char Str5 = "αρντουίνο"; char Str6 = "αρντουίνο";

char Str2 = ("a", "r", "d", "u", "i", "n", "o");

  • char Str3 = ("a", "r", "d", "u", "i", "n", "o", "\0");
  • char Str4 = "αρντουίνο";
  • char Str5 = "αρντουίνο";
  • char Str6 = "αρντουίνο";
  • Επιτρεπόμενες λειτουργίες κατά τη δήλωση συμβολοσειρών
  • Δηλώστε έναν πίνακα χαρακτήρων χωρίς να τον αρχικοποιήσετε (Str1)

Δηλώστε έναν πίνακα χαρακτήρων με ένα περιττό στοιχείο, ο ίδιος ο μεταγλωττιστής θα προσθέσει τον απαιτούμενο μηδενικό χαρακτήρα (Str2)

Συνήθως, όλες οι συμβολοσειρές τερματίζονται με έναν μηδενικό χαρακτήρα (κωδικός ASCII 0), ο οποίος επιτρέπει λειτουργίες (όπως Serial.print()) καθορίστε το μήκος της χορδής. Χωρίς αυτό το σύμβολο, θα συνέχιζαν να διαβάζουν διαδοχικά byte μνήμης που δεν θα ήταν πλέον μέρος της συμβολοσειράς.

Ουσιαστικά, αυτό σημαίνει ότι το μήκος της συμβολοσειράς σας θα πρέπει να είναι 1 χαρακτήρα μεγαλύτερο από το κείμενο που θα θέλατε να αποθηκεύσετε σε αυτήν. Αυτός είναι ο λόγος για τον οποίο οι Str2 και Str5 πρέπει να έχουν μήκος 8 χαρακτήρες, παρόλο που η λέξη "arduino" καταλαμβάνει μόνο 7 - η τελευταία θέση συμπληρώνεται αυτόματα με έναν μηδενικό χαρακτήρα. Το μέγεθος του Str4 θα γίνει αυτόματα 8 - ένας χαρακτήρας απαιτείται για τον τερματισμό null. Στη συμβολοσειρά Str3, εμείς οι ίδιοι καθορίσαμε τον μηδενικό χαρακτήρα (που συμβολίζεται με "\0").

Σημειώστε ότι είναι γενικά δυνατό να δηλώσετε μια συμβολοσειρά χωρίς τερματικό μηδενικό χαρακτήρα (για παράδειγμα, εάν ορίσετε το μήκος του Str2 σε 7 αντί για 8). Ωστόσο, αυτό θα σπάσει τις περισσότερες συναρτήσεις συμβολοσειράς, επομένως δεν πρέπει να το κάνετε εσκεμμένα. Αυτό το σφάλμα μπορεί να προκαλέσει παράξενη συμπεριφορά ή εμφάνιση ξένων χαρακτήρων κατά την εργασία με χορδές.

Μονά ή διπλά εισαγωγικά;

Οι συμβολοσειρές δηλώνονται πάντα σε διπλά εισαγωγικά ("Abc") και οι χαρακτήρες δηλώνονται πάντα σε μονά εισαγωγικά ("A").

Αναδίπλωση μακριές γραμμές

Οι μακριές γραμμές μπορούν να τυλιχτούν ως εξής:

Char myString = "Αυτή είναι η πρώτη γραμμή" " αυτή είναι η δεύτερη γραμμή" " etcetera";

Πίνακες συμβολοσειρών

Όταν εργάζεστε με μεγάλες ποσότητες κειμένου (για παράδειγμα, σε έργα που λειτουργούν με οθόνη LCD), είναι συχνά βολικό να χρησιμοποιείτε συστοιχίες συμβολοσειρών. Δεδομένου ότι οι συμβολοσειρές είναι οι ίδιες πίνακες, αυτό είναι ουσιαστικά ένα παράδειγμα ενός δισδιάστατου πίνακα.

Στο παρακάτω πρόγραμμα, ο αστερίσκος μετά τον τύπο δεδομένων char "char*" υποδεικνύει ότι η μεταβλητή είναι ένας πίνακας "δείκτες". Όλα τα ονόματα πινάκων είναι στην πραγματικότητα δείκτες, επομένως ο αστερίσκος είναι απαραίτητος για τη δημιουργία ενός πίνακα πινάκων. Οι δείκτες στο C είναι ένα από τα πιο δύσκολα πράγματα για αρχάριους, αλλά σε αυτήν την περίπτωση, δεν απαιτείται βαθιά κατανόηση των δεικτών για την αποτελεσματική χρήση τους.

Παράδειγμα

char* myStrings=("This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5", "This is string 6"); void setup())( Serial.begin(9600); ) void loop())( for (int i = 0; i< 6; i++){ Serial.println(myStrings[i]); delay(500); } }

String text = "Temp: " + tempC + " C";

Δυστυχώς, αυτή η τεχνική δεν λειτουργεί στο C. Σε αυτήν την περίπτωση, το μήνυμα μπορεί να εκτυπωθεί χρησιμοποιώντας διάφορες δηλώσεις εκτύπωσης, όπως φαίνεται παρακάτω:

lcd.print("Θερμοκρασία: "); lcd.print(tempC); lcd.print("C");

Αυτή η προσέγγιση εξαλείφει την ανάγκη για παρασκηνιακή αντιγραφή δεδομένων κατά τη συνένωση συμβολοσειρών, όπως συμβαίνει σε άλλες σύγχρονες γλώσσες.

Μια παρόμοια προσέγγιση που χρησιμοποιεί πολλαπλές οδηγίες εξόδου μπορεί να χρησιμοποιηθεί με τη σειριακή οθόνη και τις οδηγίες Serial.print. Σε τέτοιες περιπτώσεις, η τελευταία εντολή στη γραμμή είναι συνήθως η εντολή println, η οποία προσθέτει έναν χαρακτήρα νέας γραμμής στο τέλος.

Μορφοποίηση συμβολοσειρών με sprintf

Η τυπική βιβλιοθήκη συναρτήσεων συμβολοσειρών C (δεν πρέπει να συγχέεται με τη βιβλιοθήκη αντικειμένων συμβολοσειράς Arduino, που θα συζητηθεί στην επόμενη ενότητα) περιλαμβάνει μια πολύ βολική συνάρτηση sprintf που μορφοποιεί πίνακες χαρακτήρων. Εισάγει μεταβλητές τιμές σε μια συμβολοσειρά προτύπου, όπως φαίνεται στο ακόλουθο παράδειγμα:

sprint(line1, "Temp: %d C", tempC);

Η γραμμή 1 του πίνακα χαρακτήρων είναι μια προσωρινή μνήμη συμβολοσειράς που περιέχει μορφοποιημένο κείμενο. Όπως αναφέρθηκε στο παράδειγμα, έχει χωρητικότητα 17 χαρακτήρων, συμπεριλαμβανομένου του επιπλέον μηδενικού χαρακτήρα στο τέλος. Επέλεξα το όνομα γραμμή 1 επειδή πρόκειται να δείξω πώς να σχηματίσετε τα περιεχόμενα της επάνω γραμμής για μια οθόνη LCD με δύο γραμμές των 16 χαρακτήρων η καθεμία.

Η πρώτη παράμετρος μεταβιβάζει την εντολή sprintf έναν πίνακα χαρακτήρων στον οποίο πρέπει να γραφτεί το αποτέλεσμα. Το επόμενο όρισμα είναι μια συμβολοσειρά μορφής που περιέχει ένα μείγμα απλού κειμένου όπως Temp: και εντολών μορφοποίησης όπως %d. Σε αυτήν την περίπτωση, %d σημαίνει "υπογεγραμμένος δεκαδικός ακέραιος". Οι υπόλοιπες παράμετροι θα εισαχθούν στη συμβολοσειρά μορφοποίησης με τη σειρά που εμφανίζονται στη θέση των εντολών μορφοποίησης.

Για να εμφανιστεί η ώρα στη δεύτερη γραμμή της οθόνης LCD, μπορεί να διαμορφωθεί από τις μεμονωμένες τιμές ωρών, λεπτών και δευτερολέπτων, όπως φαίνεται παρακάτω:

sprintf(line2, "Time: %2d:%02d:%02d", h, m, s);

Εάν προσπαθήσετε να εξάγετε τη γραμμή 2 σε σειριακή οθόνη ή οθόνη LCD, θα δείτε το κείμενο

Η εντολή sprintf όχι μόνο εισήγαγε τους αριθμούς στις σωστές θέσεις, αλλά πρόσθεσε επίσης ένα μηδενικό στην αρχή πριν από τον αριθμό 5. Στο παράδειγμα, μεταξύ των χαρακτήρων: υπάρχουν εντολές για τη μορφοποίηση των τριών στοιχείων χρόνου. Το ρολόι αντιστοιχεί στην εντολή %2d, η οποία εκτυπώνει έναν διψήφιο δεκαδικό αριθμό. Οι εντολές μορφοποίησης για λεπτά και δευτερόλεπτα είναι ελαφρώς διαφορετικές (%02d). Αυτές οι εντολές εξάγουν επίσης διψήφιους δεκαδικούς αριθμούς, αλλά προσθέτουν ένα μηδέν στην αρχή εάν είναι απαραίτητο.

Ωστόσο, έχετε κατά νου ότι αυτή η τεχνική είναι για τιμές int. Δυστυχώς, οι προγραμματιστές του Arduino δεν εφάρμοσαν υποστήριξη για άλλους τύπους όπως το float στην τυπική βιβλιοθήκη C.

Προσδιορισμός μήκους χορδής

Δεδομένου ότι οι συμβολοσειρές που αποθηκεύονται σε πίνακες χαρακτήρων είναι συχνά μικρότερες από τους ίδιους τους πίνακες, η βιβλιοθήκη παρέχει μια βολική συνάρτηση που ονομάζεται strlen. Αυτή η συνάρτηση μετράει τον αριθμό των χαρακτήρων σε έναν πίνακα που προηγείται του μηδενικού χαρακτήρα που σηματοδοτεί το τέλος της συμβολοσειράς.

Η συνάρτηση παίρνει έναν πίνακα χαρακτήρων στη μόνη της παράμετρο και επιστρέφει το μέγεθος της συμβολοσειράς (εξαιρουμένου του κενού χαρακτήρα) που είναι αποθηκευμένο σε αυτήν, για παράδειγμα την εντολή

θα επιστρέψει τον αριθμό 3.

Βιβλιοθήκη αντικειμένων συμβολοσειρών Arduino

Το Arduino IDE, ξεκινώντας με την έκδοση 019, που κυκλοφόρησε πριν από αρκετά χρόνια, περιλαμβάνει τη βιβλιοθήκη String, η οποία είναι πιο κατανοητή και φιλική στους προγραμματιστές που χρησιμοποιούν Java, Ruby, Python και άλλες γλώσσες όπου η συνένωση συμβολοσειρών μπορεί να πραγματοποιηθεί με έναν απλό τελεστή +. Αυτή η βιβλιοθήκη προσφέρει επίσης πολλές βοηθητικές λειτουργίες για εργασία με συμβολοσειρές.

Φυσικά, αυτή η βιβλιοθήκη προσθέτει αρκετά kilobyte κώδικα στο σκίτσο. Επιπλέον, χρησιμοποιεί έναν δυναμικό μηχανισμό εκχώρησης μνήμης με όλα τα συνακόλουθα προβλήματα όπως η εξάντληση της μνήμης. Επομένως, σκεφτείτε προσεκτικά πριν αποφασίσετε να το χρησιμοποιήσετε. Πολλοί χρήστες του Arduino προτιμούν να χρησιμοποιούν κανονικούς πίνακες χαρακτήρων.

Αυτή η βιβλιοθήκη είναι εκπληκτικά εύκολη στη χρήση και αν έχετε εργαστεί ποτέ με συμβολοσειρές σε Java, θα νιώσετε σαν στο σπίτι σας με τη βιβλιοθήκη αντικειμένων συμβολοσειρών Arduino.

Δημιουργία χορδών

Μπορείτε να δημιουργήσετε μια συμβολοσειρά από έναν πίνακα στοιχείων char ή από μια τιμή int ή float, όπως φαίνεται στο ακόλουθο παράδειγμα:

Μήνυμα συμβολοσειράς = "Θερμοκρασία: ";

String temp = String(123);

Σύνδεση χορδών

Οι συμβολοσειρές μπορούν να συνδυαστούν μεταξύ τους και με άλλους τύπους δεδομένων χρησιμοποιώντας τον τελεστή +. Δοκιμάστε να προσθέσετε τον ακόλουθο κώδικα στη συνάρτηση εγκατάστασης ενός κενού σκίτσου:

Serial.begin(9600);

Μήνυμα συμβολοσειράς = "Θερμοκρασία: ";

String temp = String(123);

Serial.println(message + temp + "C");

Σημειώστε ότι η τελευταία τιμή που προστέθηκε στη συμβολοσειρά είναι στην πραγματικότητα ένας πίνακας χαρακτήρων. Εάν το πρώτο στοιχείο στην ακολουθία τιμών μεταξύ των τελεστών + είναι μια συμβολοσειρά, τα υπόλοιπα στοιχεία θα μετατραπούν αυτόματα σε συμβολοσειρές πριν συνδεθούν.

Άλλες συναρτήσεις συμβολοσειράς

Στον πίνακα Το 6.1 παραθέτει μερικές ακόμη χρήσιμες λειτουργίες από τη βιβλιοθήκη String. Μπορείτε να βρείτε μια πλήρη λίστα με τις διαθέσιμες λειτουργίες στη διεύθυνση http://arduino.cc/en/Reference/StringObject.

Πίνακας 6.1.Μερικές χρήσιμες συναρτήσεις στη βιβλιοθήκη String

Λειτουργία

Παράδειγμα

Περιγραφή

char ch = Συμβολοσειρά ("abc")

Η μεταβλητή ch θα λάβει την τιμή "a"

Συμβολοσειρά s = "abc";

Θα αφαιρέσει τα κενά και από τις δύο πλευρές της ομάδας χαρακτήρων abc. Η μεταβλητή s θα λάβει την τιμή "abc"

Συμβολοσειρά s = "123";

int x = s.toInt();

Μετατρέπει την παράσταση συμβολοσειράς ενός αριθμού σε τιμή int ή long

String s = "abcdefg";

Συμβολοσειρά s2 = s.substring(1, 3);

Επιστρέφει ένα τμήμα της αρχικής συμβολοσειράς. Η μεταβλητή s2 θα λάβει την τιμή "bc". Οι παράμετροι περνούν: το ευρετήριο του πρώτου χαρακτήρα του τμήματος και το ευρετήριο του χαρακτήρα που ακολουθεί τον τελευταίο χαρακτήρα του θραύσματος

String s = "abcdefg";

s.replace("de", "DE");

Αντικαθιστά όλες τις εμφανίσεις του "de" σε μια συμβολοσειρά με "DE". Η μεταβλητή s2 θα λάβει την τιμή "abcDEfg"

Χρήση EEPROM

Τα περιεχόμενα όλων των μεταβλητών που χρησιμοποιούνται στο σκίτσο του Arduino χάνονται όταν απενεργοποιηθεί η τροφοδοσία ή πραγματοποιηθεί επαναφορά. Για να αποθηκεύσετε τις τιμές, πρέπει να εγγραφούν byte byte στη μνήμη EEPROM. Το Arduino Uno έχει μνήμη EEPROM 1 KB.

ΣΗΜΕΙΩΜΑ

Αυτό δεν ισχύει για το Arduino Due, το οποίο δεν διαθέτει EEPROM. Σε αυτό το μοντέλο, τα δεδομένα θα πρέπει να αποθηκεύονται σε μια κάρτα microSD.

Για να διαβάσετε και να γράψετε δεδομένα στο EEPROM, πρέπει να χρησιμοποιήσετε τη βιβλιοθήκη που περιλαμβάνεται στο Arduino IDE. Το ακόλουθο παράδειγμα δείχνει πώς να γράψετε ένα μόνο byte στο EEPROM, σε αυτήν την περίπτωση η λειτουργία εκτελείται στη συνάρτηση εγκατάστασης:

#συμπεριλαμβάνω

byte valueToSave = 123

EEPROM.write(0, valueToSave);

Το πρώτο όρισμα στη συνάρτηση εγγραφής είναι η διεύθυνση στο EEPROM όπου πρόκειται να γραφτεί το byte δεδομένων και το δεύτερο είναι η τιμή που πρέπει να εγγραφεί σε αυτήν τη διεύθυνση.



Συνιστούμε να διαβάσετε

Κορυφή