La question m’a été posée par un utilisateur qui souhaitait envoyer des données en hexadécimal, stockées dans un fichier, vers une machine connectée sur le port série du Raspberry Pi.
Au sommaire :
Envoyer des données en hexadécimal sur le port série du Raspberry Pi
Ce court article est plutôt une note qui pourra aider ceux qui ont la même problématique.
Le fichier de données
Les données étant stockées dans un fichier, j’ai créé un fichier data dans lequel j’ai mis du texte. Le texte c’est… du binaire, codé en ASCII.
Et qui dit binaire, dit hexadécimal, ce dernier étant simplement une représentation plus accessible pour les humains du premier.
Du coup pour avoir autre chose que du texte ou des chiffres codés en ASCII, j’ai utilisé hexedit (après l’avoir installé sur le Raspberry Pi) pour transformer certains caractères en nombres hexa qui ne soient ni des chiffres ni des lettres :
Le port série du Raspberry Pi 3
Pour ceux qui n’ont pas vu passer l’information, il y a un lézard avec le port série du Pi 3. La fondation a discrètement utilisé l’UART matériel pour le Bluetooth, le port série se voyant connecté à un UART software au rabais.
Parfait si vous utilisez le Bluetooth, un peu em…bêtant si vous avez besoin réellement du port série. J’ai publié un article sur ce problème de port série il y a quelque temps. Pour configurer le Pi 3 et utiliser l’UART matériel sur le port série, j’ai choisi l’option 1 car je n’utilise pas le Bluetooth sur cette carte.
Le programme Python
send_data SVP ne m’incendiez pas, c’est en partie récupéré sur des exemples et en partie écrit sur un coin de table. Si vous faites mieux (et ce n’est pas difficile), je peux publier votre solution 😉
Quoi qu’il en soit, vous pouvez télécharger le programme pour éviter de le saisir.
Rapidement :
Le programme initialise le port série puis il ouvre le fichier data qui contient les octets à envoyer. Il envoie les données à l’écran et au port série, et boucle tant que le fichier n’est pas fini.
Résultat sur un terminal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pi@raspberrypi:~/test_serie $ ./send_data b'\x02' b'\x03' b'\x04' b'5' b'6' b'7' b'8' b'\x7f' b'~' b'j' b'\xb5' b'\xc2' b'\xd4' b'\xe8' b'\xff' b'' |
Oui je sais il manque le premier octet 🙂 je vous laisse voir pourquoi et modifier le programme. Ici c’était juste une POC !
Résultat sur le port série
Le mieux pour voir ce qui est envoyé par le port série, c’est ce regarder ce qui se passe avec… le port série !
Pour cela on va relier la sortie TxD à l’entrée RxD (un fil entre la patte 8 et la patte 10). Les plus anciens se souviendront des « bouchons » RS232 que tout technicien digne de ce nom trimballait dans sa valise pour tester les ports série chez le client.
Quand on avait oublié son bouchon DB9 ou DB25, un simple trombone faisait l’affaire 😉
Une fois la boucle réalisée, tout ce qui sort sur TxD revient sur RxD. On pourrait modifier le programme pour recevoir et afficher ce qui arrive. Pour ma part j’ai choisi la solution de facilité et utilisé un terminal pour afficher le résultat : minicom
Comment faire ? J’ouvre 2 terminaux sur le Raspberry Pi 3.
- Dans l’un je lance minicom qui se met à l’écoute du port série et affiche tout ce qui arrive (en Hexa car j’ai ajouté -H sur la ligne de commande)
- Dans l’autre j’exécute le programme send_data.
1 2 3 4 5 6 7 |
Bienvenue avec minicom 2.7 OPTIONS: I18n Compilé le Apr 22 2017, 09:14:19. Port /dev/ttyAMA0, 10:57:22 Tapez CTRL-A Z pour voir l'aide concernant les touches spéciales 02 03 04 35 36 37 38 7f 7e 6a b5 c2 d4 e8 ff |
Effectivement les données envoyées par le programme Python sont bien reçues par minicom. Il manque même le premier octet du fichier 😛
Conclusion
Ne considérez pas cet article comme un tutoriel. Il nécessite l’installation et l’utilisation de plusieurs programmes qui ne sont pas documentés ici.
Il met en œuvre l’hexadécimal, le port série qui ne sont pas forcément familiers aux débutants.
Voyez y un simple guide destiné à servir d’aide mémoire pour ceux qui auront à réaliser ce genre d’opération.
Une autre commande pour afficher des données en hexa (du port série, ou même d’un fichier binaire)
hexdump -C /dev/ttyAMA0
attention à bien mettre l’option -C (majuscule), sinon les données sont affichées par groupe de 2 octets avec les poids faibles et forts inversés (little endian…)
Bonjour,
Je ne sais pas si vous le savez François mais vous pouvez utiliser un arduino en tant que convertisseur usb-TTL. Je viens de le faire sur une RPiv1, en tant que connection secours si l’adressage APIPA ne fonctionne pas.
Bonjour
non, je n’ai pas testé cette solution ! merci pour l’info 🙂
si vous voulez en faire un article pour le blog ce sera avec plaisir
Salut , j’ai une petite question , pourquoi le raspberry pi envoie les données vers le HAT que sur 16 bit et pas sur 8 bit ?
bonjour
euh dans quel contexte ? avec quel langage ? quelle instruction ?
difficile de vous répondre si on n’a pas les éléments 🙂
cdt
françois
Oh, rien de bien compliqué ! On met le reset au gnd puis la borne Rx de l’arduino (Uno dans mon cas) au Rx du pi, Tx au Tx et GND au GND puis on alimente normalement la Pi. Et j’ai utilisé MobaXterm pour les sessions (série et ssh).
source : https://www.arduino.cc/reference/en/language/functions/communication/serial/
Par contre en relisant, je n’ai pas fait attention à la tension qui diffère suivant les cartes, 5 ou 3V3.
Ma Uno de contrefaçon travaille en 5V (confirmé au voltmètre, 4V pour Tx et 5V pour Rx)
source https://store.arduino.cc/arduino-uno-rev3
J’ai eu de la chance, c’est costaud ces petites bêtes 🙂
Ping : Un GPS USB pour le Raspberry Pi - Framboise 314, le Raspberry Pi à la sauce française....