2017-05-12 6 views
0

J'essaie de convertir l'entrée des GPIO d'un pi de framboise à un int. J'ai donc cinq entrées numériques et je veux lire les entrées. Une fois que j'ai eu les valeurs, je les stocke dans un tableau. La prochaine chose serait de convertir le contenu du tableau en un nombre entier.Convertir le signal binaire en nombre int

Alors, voici mon code:

int a = digitalRead(PIN_16); 
int b = digitalRead(PIN_18); 
int c = digitalRead(PIN_22); 
int d = digitalRead(PIN_24); 
int e = digitalRead(PIN_26); 

int array[5]; 

array[0]=a; 
array[1]=b; 
array[2]=c; 
array[3]=d; 
array[4]=e; 

Pour convertir le contenu du tableau à un certain nombre, je youse si les conditions pour voir si la première entrée est 1 ou 0. Si le 1 I a 1, autre 0. Et ainsi de suite ...

Ma question est maintenant s'il y a une façon plus élégante de faire cela.

+1

Que doit être mesuré? (par exemple, quel devrait être le nombre si seulement pin16 est haut) – Lanting

+0

Multipliez chaque valeur par une puissance différente de 2 (ou déplacez-les à gauche de différentes quantités) et ajoutez-les ensemble (ou alternativement, bit-sage-OU ensemble) . Par exemple 'value = (a << 0) | (b << 1) | (c << 2) | (d << 3) | (e << 4); ' –

Répondre

2

juste "changement" bits dans les positions appropriées du nombre:

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= a[i] << i; 
} 

Cela fonctionnera en cas digitalRead est de retour 0 ou 1 seulement. Dans le cas où il retourne 0 ou un non-zero valeurs que nous aurons besoin de le vérifier contre zéro à la place:

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= (a[i] != 0) << i; // (a[i] != 0) will have a value of `1` for any non-zero `a[i]` 
} 

ou truc encore plus idiomatiques:

number |= !!a[i] << i; 

Ceci est une double négation logique. Le premier transformera tout non-zéro en 0, le second transformera le 0 en 1.

+0

Cela ne fonctionne que si' digitalRead' renvoie un 1 lorsque la broche est haute. J'ai vu des implémentations où 'digitalRead' renvoie déjà un bitset et vous pourriez appeler la fonction comme:' digitalRead (PIN1 | PIN2 | PIN5); 'et j'ai également vu des implémentations où il retourne' 0 ~; pin est haut ... – Lanting

+0

@Lanting Ouais, c'était mon hypothèse. J'en ajouterai d'autres pour résoudre ce problème. –

+0

@EugeneSh. Merci votre fonction a fonctionné très bien sur une framboise. Juste pour information: La fonction digitalread() dans wiringpi.h renvoie 0 ou 1. – user3794592

0

vous pouvez le faire avec des opérations de manipulation de bits:

result = array[4]<<4 | array[3]<<3 | array[2]<<2 | array[1]<<1 | array[0]