Modification de registe, Serial to byte.

Bonjours à tous,

Aujourd'hui je viens vous demander de l'aide, car j'ai un projet du a mes études et je suis bloqué sur une partie de programmation. Une partie de ce projet comprend à communiqué par liaison SPI mais surtout à modifier des Registres dans un Allegro A4960. Aussi je voudrais faire ceci : A l'aide de la communication Serial écrire par exemple 01100101 et que ça le convertie en byte Byte = 0b01100101 pour pouvoir l'envoyer a mon composant. Seulement ça ne marche pas comme ça mais plutôt le byte s'écrit par le premier 0 en ASCII je crois. J'ai eu beau regarder sur internet je n'ai pas réussi à trouver de solutions...

Si vous avez des idées à explorer, je suis preneur.

Ps: Désolé pour mes fautes d'orthographe.

Kris_M

Salut,

Plusieurs solutions possibles. La plus simple en l'état c'est que si tu veux envoyer 01100101 par exemple, tu envois 101 (01100101 en décimal) tu réceptionnes dans un tableau de char, tu utilises atoi() pour passer en byte

A ma connaissance atoi() ne fonctionne qu'en base 10

Il y a strtol qui ferait l'affaire mais je ne sais pas si cette fonction est portée sur Arduino et je ne rien pour l'essayer actuellement.

long strtol(const char *s, char **endp, int base)
strtol converts the prefix of s to long, ignoring leading white space; it stores a
pointer to any unconverted suffix in *endp unless endp is NULL. If base is between 2
and 36, conversion is done assuming that the input is written in that base. If base is
zero, the base is 8, 10, or 16; leading 0 implies octal and leading 0x or 0X hexadecimal.
Letters in either case represent digits from 10 to base-1; a leading 0x or 0X is
permitted in base 16. If the answer would overflow, LONG_MAX or LONG_MIN is
returned, depending on the sign of the result, and errno is set to ERANGE.

extrait de The C programming language

Oui mais rien n’empêche le cast direct :

byte MonByte=byte(atoi(Buffer));

Si tu entres "0101" dans atoi() tu vas récupérer 101 et pas 5

Bin oui : 101 en décimal donc 01100101 en binaire

Il veut faire la saisie en binaire

Pour analyser la chaîne reçue, il faut faire une petite boucle de conversion tu initialises une variable à 0 tu initialise un compteur avec la longueur de la chaine-1 début de boucle tu décales le contenu de la variable d'un bit vers la gauche tu prend le caractère de la chaîne pointé par le compteur tu testes si c'est un zéro ou un un tu positionnes le bit de poids faible en conséquence dans la variable tu décrémentes le compteur tu retournes au début de boucles tant que le compteur est différent de 0

fdufnews: Il veut faire la saisie en binaire

Ce que je proposais c'était justement une solution simple "entre les deux", à savoir juste faire une conversion binaire -> décimale (calculatrice windows => 10 sec)

Bonjours tout le monde, tout d'abord, merci pour vos réponses =)

B@tto : Merci pour ta solution, seulement, j'ai énormement de configuration à en peu de temps, aussi les conversions binaire --> décimale sérait trop long pour moi. =)

fdufnews : la succession se faire dans un tableau byte[] ?

Coordialement. Kris_M

Si tu dois recevoir 8 bits :

if (Serial.available()>=8) {

byte MonByte=0;

for (int i = 7 ;i >=0 ;i--) {
Serial.read()==48? : MonByte |= 1<<i; // si le caractère reçu est un '0' ne fait rien, sinon on considère que c'est un 1 
}

}

Salut, ça ne fonctionne pas si mon byte commence pas un '0' du coup =S

Bin si : un byte c'est un byte. si tu stocke en bianire 01, dans tous les cas dans la mémoire ça sera 00000001

B@tto : Tout mes excuses ! Tu as raison =) Merci beaucoup pour ton aide !

Coordialement Kris_M