2017-09-08 5 views
0

J'essaie actuellement de communiquer avec un élément matériel qui mesure certaines données.Précise période de lecture pyserial

Je dois interagir avec ce matériel via série. Je peux obtenir des données en envoyant une chaîne GETDATA à l'appareil. Mon objectif est d'obtenir des données précisément à 1 seconde. J'ai une lecture de fil et une écriture de fil pour qu'ils ne se bloquent pas.

Actuellement en utilisant cette méthode, j'obtiens une augmentation de 1 milliseconde toutes les quelques secondes. N'y a-t-il aucun moyen d'empêcher cela ou peut-il y avoir une technique pour l'optimiser davantage?

def _writing(self): 
    start_time = 0 
    while(self.__running_write): 
     current_time = time.time() 
     if (current_time - start_time) >= self.interval: 
      ser.write("GETDATA\r") 
      start_time = current_time 

def _reading(self): 
    while(self.__running_read): 
     data = ser.read(100) 
     if data: 
      _output = "{0}".format(str(datetime.now())) 
      print _output 

Sortie:

2017-09-08 14:53:44.335000 


2017-09-08 14:53:45.335000 


2017-09-08 14:53:46.336000 


2017-09-08 14:53:47.336000 


2017-09-08 14:53:48.337000 


2017-09-08 14:53:49.337000 


2017-09-08 14:53:50.338000 


2017-09-08 14:53:51.338000 


2017-09-08 14:53:52.339000 


2017-09-08 14:53:53.339000 

Répondre

0

tout d'abord «Tout le monde est temps». Il n'y a pas de source de fréquence idéale (Frequency drift) ou 100% de temps de précision (Clock drift). La fréquence du périphérique source ou du port de l'ordinateur n'est pas aussi précise. La fréquence peut être affectée par des retards dans le niveau du matériel d'E/S, OS, charge sur le CPU, les interactions disque dur ...

Vous pouvez définir l'horodatage précis (ne pas oublier NTP ou peut-être PTP ou GPS-based time source) pour chaque paquet de données et corriger les minutages dans l'étape de traitement des données. De nombreux appareils ont une source de temps interne (parfois pas aussi précise!) Pour créer des horodatages plus précis. Mais si vous avez vraiment besoin d'une fréquence de collecte de données stable (si la priorité du processus de collecte de données est maximale et que l'outil de collecte de données devient un environnement d'OS temps réel, la stabilité n'est pas assurée). est un paquet de données de suppression ou dublicate (ou une partie de celui-ci) pour corriger la fréquence, puis l'erreur deviendra trop. Voir l'historique de leap second par exemple.