Probème d'envoie via python + script.sh


#1

Bonjour !

Alors voila j’ai une gros gros problème avec l’envoie de sms avec mon script python depuis un script.sh .
Explication : l’envoie de sms normal fonctionne (gammu-smsd-inject) pas de soucis , j’ai créé un script python permettant de recevoir des infos sur le port série de la raspberry et les transmettre en sms et celui la aussi fonctionne , pour finir j’ai créé un script.sh qui permet de configurer le port série avec stty -F , m’envoyer un message me disant comment cela a été configuré et qui lance mon script python seulement voila le problème qui arrive. Si je lance mon script python et que j’écris “test message” je reçoit un sms où il est écrit “test message” pas de problème cependant si je le lance via mon script.sh avec ce même message “test message” je reçois les caractère de la chaîne , dans un ordre aléatoire et sous plusieurs sms . Voici ce que je reçoit avec cet exemple :

  • etmsae
  • ts esg

deux sms avec les caractères de la chaine mais dans un ordre complètement aléatoire.
Je ne vois pas d’où viens le problème sachant qu’a partir d’environ 6 chaînes de caractère envoyées, le problème disparaît et si je renvoie une chaîne elle revient dans le bon ordre sous la forme d’un seul sms. Mais je n’ai pas envie d’écrire a chaque fois 6 chaînes de caractère pour en recevoir une qui sois lisible…
Quelqu’un aurait une idée d’où pourrais provenir le problème ? je peux fournir les codes si jamais.

Merci d’avance
Jonathan


#2

Sans doute au niveau de ton script python. On peut voir ?


#3

Je ne pense pas il fonctionne très bien de son coté mais le voici :

#!/usr/bin/python3
# -*- coding: utf-8 -*
import time
import serial
import gammu.smsd
import signal
from threading import Timer

smsd = gammu.smsd.SMSD('/etc/gammu-smsdrc')


import sys

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate=9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS
)
ser.close()
ser.open()
ser.isOpen()
print ('Enter your commands below.\nInsert "exit" to leave the application.')

input=1
#ser.flushInput()
#inbuff = ser.inWaiting()
while 1 :
        if input == 'exit':
                ser.close()
                exit()
        else:
                fin = False
                out = ''
        if fin == False:
                while ser.inWaiting() > 0:
                        car = ser.read(1)
                        if car == '\n' or '\r':
                                time.sleep(1)
                                if ser.inWaiting == 0:
                                        fin = True
                        out += car.decode('ISO-8859-1')
        #while ser.inWaiting() > 0:
        #       out += ser.read(1).decode('ISO-8859-1')
        if out != '':
                time.sleep(1)
                print (out)
                message = {'Text': out, 'SMSC': {'Location': 1}, 'Number': '06XXXXXXXX'}
                smsd.InjectSMS([message])
                ser.flush()

#4

J’avoue que le time.sleep(1) dans la boucle me gêne un peu. Pendant une seconde tu rends la main au système. Pendant ce temps, on peut très bien imaginer qu’on rate des données sur le port série.
Je vois aussi “if ser.inWaiting == 0”. Il manque les parenthèses, donc on ne fait que tester si la fonction inWaiting est égale à 0, et pas son résultat. De plus, le “fin = True” semble inutile.
Par ailleurs, quel est le dispositif de l’autre côté du port série ?