Δύο 8-bit χαρακτήρες σε μια 16-bit αριθμός

B

brucelee2

Guest
Γεια σου, έχω ένα HMI που στέλνει δύο 8-bit χαρακτήρες που αντιπροσωπεύουν ένα 16-bit συντονισμό οθόνη αφής. Έτσι, σε ένα παράδειγμα, το HMI στέλνει: 0X03 τότε 0X0E (και τα δύο ξεχωριστά), οι οποίες αντιπροσωπεύουν το συντονισμό 030E (782). Πώς μπορώ να συνδυάσει τα δύο σε μια ενιαία μεταβλητή που αντιπροσωπεύει τον αριθμό 782; Σκεφτόμουν τη δημιουργία ενός "int" και η μετατόπιση κάθε σ 'αυτό κάποια πώς. δηλαδή. char first = 0x03? char δευτερόλεπτο = 0x0E? int αριθμό? αριθμός = πρώτη? αριθμός = αριθμός
 
C έχει bitwise OR λειτουργία τους για παρόμοιους σκοπούς
Code:
 αριθμός = (int) πρώτη
 
Ω ok. Im χρησιμοποιώντας MikroC, έτσι συμβουλευτείτε άρρωστος το εγχειρίδιο για να δούμε αν υπάρχει μια τέτοια λειτουργία στον compiler. Ευχαριστώ και πάλι
 
καλύτερα αν δηλώνουν όλα τα ανυπόγραφα (unsigned char και unsigned int) σε δήλωση δεδομένων και χύτευση ... έτσι
Code:
 unsigned char first = 0x03? unsigned char δευτερόλεπτο = 0x0E? unsigned int αριθμό? ... αριθμός = (unsigned int) πρώτη
 
Εναλλακτικά, μπορείτε να χρησιμοποιήσετε ένωση - η οποία δεν απαιτεί την κωδικοποίηση από την πλευρά σας. ή μια μακροεντολή:
Code:
 # WORD define (MSB, LSB) (((MSB)
 
ίσως θέλετε να χρησιμοποιήσετε περισσότερα παρένθεση εκεί για να αποφευχθεί η «|« φορέας εκμετάλλευσης πρέπει να εκτελεστεί πριν από την αριστερή στροφή
Μόνο αν δεν είστε ενήμεροι της ANSI C κανόνες προτεραιότητας τελεστών, νομίζω..
πρόβλημα προκύψει, όταν ρίχνει ένα υπογεγραμμένο char σε int όπως για 0xE0 ως «δεύτερο»
Δεν είναι σωστά χειρίζεται όλα compilers, αλλά αριθμητική μετατροπή τύπου είναι απαραίτητη για την bitwise OR από τις προδιαγραφές. Σας ευχαριστώ για την διόρθωση.
 
Καθώς χρησιμοποιείτε mikroC unsigned int Myint? Hi (Myint) = 0x03? Lo (Myint) = 0x0E? Σωρό του πιο εύκολη με αυτόν τον τρόπο. γρύλος
 
Μπορείτε να αποθηκεύσετε Πρώτη (Χαμηλή Byte) στη διεύθυνση βάση του int μεταβλητή τότε κατάστημα δεύτερο byte @ (int διεύθυνση βάσης +1) τότε κλήση / χρήση 16 bit ακέραιος χρησιμοποιούν αυτές τις μακροεντολές # define Χαμηλή (γ) (* (unsigned char * ) & (γ)) # define High (γ) (* ((unsigned char *) & (γ) +1)) char a = 0x30? char b = 0x53? int δεδομένα? Χαμηλή (δεδομένα) = a? Υψηλή ( δεδομένων) = β? τώρα χρησιμοποιούν τα δεδομένα έως και 16 bit αριθμός Ελπίζω να βρείτε την απάντηση
 
χρήση της Ένωσης, όπως παρακάτω: Ένωση {char a [2]? int b?} αριθμό? number.a [0] = 0x03? number.a [1] = 0x0E? τότε, number.b = 0x030E, κοστίζει μόλις δύο bytes της μνήμης RAM, δεν τέσσερα bytes.
 
αν έχετε κάποιο ελεύθερο bits; δοκιμάστε το εξής: αριθμός = 0? αριθμός | = πρώτη? αριθμός
 

Welcome to EDABoard.com

Sponsor

Back
Top