liaison série RS232 avec Raspberry PI 3

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

destroyedlolo
Raspinaute
Messages : 1185
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: liaison série RS232 avec Raspberry PI 3

Message par destroyedlolo » mar. 19 juin 2018 12:22

  1. Code : Tout sélectionner

    ls /dev/ttyUSB0
    dira le port a été créé
  2. sinon, /var/logs/messages devrait donner une indication pourquoi ca ne marche pas (généralement, c'est qu'il manque un module dans le kernel).
LinuxKoku a écrit :
mar. 19 juin 2018 11:57
Y'a t-il une commande pour savoir si mon matériel marche?

Je réalise que minicom est un programme d'émulation de terminal je pourrais donc envoyer et recevoir des données.

Pourrais-je envoyer n'importe quelles données?
Mon but est quand même de envoyé recevoir ces données de manière automatique et non manuelle, donc pourras-je traiter ces données et les envoyer de manière automatique? Si non, y'a t-il une autre manière de procédé comme des scripts?
Ben ... comment veux-tu qu'on te réponde ? On ne connais pas ton matos :lol: Il te faut donc voir la doc. C'est d'ailleurs indispensable pour savoir s'il y a du handshack ou pas, et si oui, lequel, la vitesses, etc ...
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

LinuxKoku
Messages : 38
Enregistré le : mer. 23 mai 2018 12:00

Re: liaison série RS232 avec Raspberry PI 3

Message par LinuxKoku » mar. 19 juin 2018 17:15

destroyedlolo a écrit :
mar. 19 juin 2018 12:22
Ben ... comment veux-tu qu'on te réponde ? On ne connais pas ton matos :lol: Il te faut donc voir la doc. C'est d'ailleurs indispensable pour savoir s'il y a du handshack ou pas, et si oui, lequel, la vitesses, etc ...
Petite erreur: j'ai configuré la vitesse a 9600 mais 8N1, j'ai bien enregistré, mais quand j'exécute la ligne de commande dmesg | grep tty, il m'affiche toujours 115200 ! sachant que je devrais travaillé avec une vitesse de 9600, que dois-je faire?

J'ai pu configurer le port série et il est détecté par le Raspberry PI.
Afin de pouvoir échangé avec le système de comptage, je dois faire un programme sur le raspberry PI, pour envoyé des trames de données (des octets) plus exactement une chaîne hexadécimal par le port série, et je devrais recevoir une trame de résultats que je devrais visualiser (afficher)

Donc maintenant je devrais écrire un programme capable d'envoyer des données de type chaîne hexadécimale, des indications?

:!: mon tuteur m'a informé que les données véhiculées sont des octets (ASCII), mais que ce que je devrais envoyer et recevoir c'est une chaîne de caractères hexadécimale, donc il faudrait pensé à convertir à chaque fois les octets en chaîne de caractères ! que voulez t-il dire exactement?

destroyedlolo
Raspinaute
Messages : 1185
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: liaison série RS232 avec Raspberry PI 3

Message par destroyedlolo » mer. 20 juin 2018 09:13

LinuxKoku a écrit :
mar. 19 juin 2018 17:15
Petite erreur: j'ai configuré la vitesse a 9600 mais 8N1, j'ai bien enregistré, mais quand j'exécute la ligne de commande dmesg | grep tty, il m'affiche toujours 115200 ! sachant que je devrais travaillé avec une vitesse de 9600, que dois-je faire?
La question évidente est ... où l'as tu configuré. Si c'est dans minicom, c'est normal que dmesg affiche toujours la valeur par défaut.
Pour le configurer au niveau du système, tu peux créer un script avec les commandes que je décris sur cette page (§ "Configuration des ports séries" et "Et pour faire plus propre, un fichier de démarrage").
LinuxKoku a écrit :
mar. 19 juin 2018 17:15
Afin de pouvoir échangé avec le système de comptage, je dois faire un programme sur le raspberry PI, pour envoyé des trames de données (des octets) plus exactement une chaîne hexadécimal par le port série, et je devrais recevoir une trame de résultats que je devrais visualiser (afficher)
Donc maintenant je devrais écrire un programme capable d'envoyer des données de type chaîne hexadécimale, des indications?
Ben déjà, je pense qu'il aurait été "fair play" d'indiquer que c'était dans le cadre d'un projet d'étude / stage / alternance car le niveau des réponses que nous pourrions apporter n'est pas le même.
Ensuite ... il est évident que nous n'allons pas faire le taf a ta place. A toi donc de voir en fonction de tes compétences, envies, inspirations ou de ce qui t'es imposé, le langage que tu va utiliser. Car ce que tu demandes est très simple et peut se faire avec en script shell, en python (et là, je ne pourrais t'aidé vu que je n'utilise pas), en Lua, en C, en ce que tu veux.
Et comme c'est vraiment une problématique qui est presque aussi vielle que l'informatique et tu trouveras des exemples/tuto à foison.
Si tu choisis le C, sur la page de j'ai mis plus haut, il y a un lien vers les sources de TéléInfod qui répond à la moitié de ton besoin : recevoir un trame. Restera a décoder les infos ... (mais ca ne vaut pas un bon tuto que tu trouveras facilement sur le web).
LinuxKoku a écrit :
mar. 19 juin 2018 17:15
:!: mon tuteur m'a informé que les données véhiculées sont des octets (ASCII), mais que ce que je devrais envoyer et recevoir c'est une chaîne de caractères hexadécimale, donc il faudrait pensé à convertir à chaque fois les octets en chaîne de caractères ! que voulez t-il dire exactement?
Ben qu'une RS-232 n'est pas fait pour envoyer / recevoir des données binaire et que donc elles doivent etre convertie en suite de caractère. La représentation hexa en est un exemple : https://fr.wikipedia.org/wiki/Syst%C3%A8me_binaire

Enfin, je pense que ce qui t'es demandé, c'est de faire un minimum de recherche (en tout cas, c'est ce que je demande lorsque je dois noter des stagiaires ou mes alternants). Si on te fait le boulo tout maché (et c'est un peu ce que j'ai fais), non seulement, ca ne t'apportera rien, mais tu risques de te faire étaler par ton prof ou ton tuteur, surtout sur des questions aussi simples.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

LinuxKoku
Messages : 38
Enregistré le : mer. 23 mai 2018 12:00

Re: liaison série RS232 avec Raspberry PI 3

Message par LinuxKoku » lun. 25 juin 2018 12:05

Merci pour votre aide
Pour le "fair play", vous devriez regarder sa (https://forums.framboise314.fr/viewtopic.php?f=4&t=4722)(je me suis trompé sur le fait qu'on ai déjà fait la liaison RS232), n'ayant pas eu de réponse, j'ai pensé à cibler mes questions sur des petite partie du projet, parce que je pense que tel publier, on ne peut pas tout expliqué à la fois, donc désolé pour ce malentendu
Après plusieurs recherches, et aussi grâce a vos indications j'ai pu réussir à faire l'envoi de la trame, celle ci est bien reçue, le système de comptage me renvoi une trame de résultat, mais je n'arrive pas à l'afficher, en exécutant ce code:

Code : Tout sélectionner

import time
import serial
 
ser = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate = 9600,
        parity=serial.PARITY_ODD,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)
 
while 1:
        x=ser.readline()
        print (x)
L'exécution ne s’arrête pas et rien ne s'affiche ! pour arrêter l’exécution je dois faire Ctrl+c !
D'ou vient ce problème?

destroyedlolo
Raspinaute
Messages : 1185
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: liaison série RS232 avec Raspberry PI 3

Message par destroyedlolo » lun. 25 juin 2018 16:13

Salut,

Peux-têtre devrais-tu mettre un lien vers l'autre poste histoire de replacer dans le context ;)


La premiere chose qui me choque dans ton code, c'est que tu ne teste pas si le port série a été correctement ouvert. Mais peut-être émet-il une exception en cas de pb ? a toi de voir (je n'utilise pas python car j'ai trouver mon bonheur dans d'autres langages, à commencé par Lua pour le scripting, ce ne sont donc que des pistes ;) ).

Si le port RS-232 est bien acquis, ce peut etre un pb classique de code de fin de ligne : en RS-232, une fin de ligne peut etre identifiée par des CR (0x0d), des LF (0x0a), des CR/LF (0x0d puis 0x0a). Dans ce cas, ton

Code : Tout sélectionner

ser.readline()
ne te rendra la main que lorsqu'une ligne entière lui parvient et donc le dit code de fin de ligne.
:arrow: il faut donc que tu vois dans la librairie Sérial comment spécifier le code de fin de ligne.

Les appareils industriels voient parfois des "trames" plutot que des lignes :
  • dans ce cas, soit les trames sont de longueur fixe, dans ce cas, tu dois lire ?? caractères avec ?? qui dépend des specs de ton appareil
  • soit les CR/LF sont remplacés par des caractères plus exotiques (ETB, RS, ...)
Voili, voila quelques pistes :)

Je ne sais répondre sur le bluetooth : je ne l'ai utiliser jusqu'a présent qu'a travers de trucs tout fait.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

LinuxKoku
Messages : 38
Enregistré le : mer. 23 mai 2018 12:00

Re: liaison série RS232 avec Raspberry PI 3

Message par LinuxKoku » mar. 26 juin 2018 12:21

Bonjour, merci infiniment pour vos indications,
J'ai au tout début exécuté une ligne de commande pour confirmé que le port série est bien attaché, et aussi grâce à super Terminal qui visualise le trafic sur le port série, j'ai pu bien voir que tout est bien envoyer et que je reçois une trame de résultat. Pour le langage de programmation, python m'a été imposé, mais merci pour les suggestions.

Je suis aller à la page de Pyserial et j'ai trouver plain de fonction pour lire les trames dont la fonction inWaiting que j'ai utilisé, et qui a très bien marché: je vous met le code ci-dessous ainsi que le résultat de l'exécution:

Code : Tout sélectionner

# -*- coding: utf-8 -*-

import serial                     
import struct                     
import time
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=0.1
)

ser.flushOutput()
ser.flushInput()
ser.flush()

ser.write((chr(0x7E) + chr(0x7E) +chr(0x73) + chr(0x02) + chr(0x73) + chr(0x02)).encode('ASCII'))

i=0

while i<11:
    time.sleep(0.1)
    if ser.inWaiting != 0:
        x=ord(ser.read(1))
        print(hex(x))
    i+=1
result:
0x7e
0x7e
0x73
0x7
0x0
0x0
0x0
0x0
0x0
0xa2
0x79
>>>     
:?: Maintenant que j'ai bien reçu la trame élément par élément grâce à la boucle while, je voudrais mettre ces bits(0x7e ...) dans un tableau (liste) pour les utiliser mais je n'arrive pas après plusieurs essais, (Par exemple je veux extraire (0x7) qui est le bit de la taille de trame, tout ces bits ont une signification donc j'ai penser a les mettre dans un tableau)
exemple :
par exemple: tab = ma trame reçue -> ([0x7e, 0x7e, 0x73, 0x7, 0x0, 0x0, ...])
et si je veux utilisé mon bit de taille(0x7), je mettrais qui sera alors l’élément 3 dans mon tableau (ma trame mise dans un tableau) :
bite_taille=tab[3]

J'ai essayé ça ! mais je pense que je suis loin dans mon incompréhension :roll: :

Code : Tout sélectionner

i=0

while i<11:
    
        time.sleep(0.1)
        if ser.inWaiting != 0:
            x=ord(ser.read(1))
            z=print(hex(x))
            
           
        i+=1
tab=[z]
print(tab)

Result:

0x7e
0x7e
0x73
0x7
0x0
0x0
0x0
0x0
0x0
0xa2
0x79
[None]
>>> 

Répondre

Retourner vers « Utilisateurs avancés »