Le transfert d'un int comme deux octets sur l'Arduino
Je suis d'échantillonnage à haute fréquence et le besoin de transmettre le 10-bit ADC valeur via UART de mon Arduino.
Par défaut, il utilise un octet par caractère. Donc, si faire un analogRead donnerait la valeur de "612", il serait envoyer via UART "6" sur un octet, "1" sur un octet, "2" sur un octet, et le terminateur de ligne que le dernier octet.
Étant donné que mon taux d'échantillonnage est tronqué par cette communication, il est important qu'il soit le plus efficace et uniforme que possible, donc je vais essayer de le forcer à utiliser deux octets à transmettre les données, n'a pas d'importance ce que les données réelles (par défaut elle serait d'utiliser trois octets à transmettre "23", quatre octets à transmettre "883" et cinq octets à transmettre "1001").
Actuellement, je suis en train de faire quelque chose de ce genre, qui est le meilleur moyen que j'ai trouvé:
int a = 600; //Just an example
char high = (char)highByte(a);
char low = (char)lowByte(a);
Serial.print(high);
Serial.println(low);
Actuellement, il utilise trois octets (y compris \n), indépendamment de la valeur. Est-il encore la méthode la plus efficace?
Juste l'impression avec quelque chose comme
Serial.print(foo, BIN);
Ne fonctionne pas du tout. En fait, il utilise un octet par tous les bits de la représentation binaire de toto, qui est tout à fait stupide.
- Ne pas envoyer de la nouvelle ligne à tous? Si vous savez que les données sont toujours une paire d'octets, et ne vous inquiétez pas sur la suppression d'un octet (vous pouvez avoir la synchronisation octets répartis dans le flux de plus en plus rares), alors il n'y a pas de raison d'utiliser un saut de ligne. En outre, si vous envoyez les données sous forme binaire, ce qui va se passer si l'un de ces octets arriver à être
10
(le même que le saut de ligne ASCII)? - Numéro de série.write() est la façon de traiter des données binaires. Le Numéro De Série.print() les fonctions sont conçus pour convertir la valeur en un texte lisible.
Vous devez vous connecter pour publier un commentaire.
J'ai peut-être raté quelque chose, mais pourquoi n'utilisez-vous pas
Serial.write(byte)
?Vous pouvez utiliser une methode comme celui-ci:
qu'allez-vous faire avec les données sur votre ordinateur?
Si vous êtes l'envoi de données binaires sur une ligne série, vous ne devriez vraiment pas tout confondre, en utilisant un style de saut de ligne séparateur.
D'autre part, c'est un peu dur (pour les autres) pour savoir qui de l'octet qui, sans une sorte de synchronisation de l'aide.
Mais, puisque vous n'avez que 10 bits de charge utile, mais envoyer les 16 bits de données, vous pouvez "faire un UTF-8" et utiliser gratuitement un peu pour le signal "démarrage de valeur". Cela nécessitera l'aide de seulement 7 bits de chaque octet de 8 bits à votre charge, mais c'est bien depuis 7 + 7 = 14, qui est beaucoup plus que 10. On peut laisser les 8 bits de dire "c'est l'octet de poids fort d'une nouvelle paire d'octets":
Ci-dessus, les deux octets transmis sont:
Le récepteur aura à faire la-dessus dans le sens inverse:
Cela devrait fonctionner, et utilise le bit de l'octet de poids fort qui est envoyé d'abord, pour signifier que c'est en effet l'octet de poids fort. L'octet de poids faible n'aura jamais le MSB ensemble.
high = ((a >> 7) & 0xff) | 0x80; low = (a & 0x7f);