2016-11-08 1 views
1

J'ai un microcontrôleur qui envoie des données via UART à 3 MBaud. Le microcontrôleur envoie un octet de démarrage/état tous les 8000 octets. J'aime mon script python pour lire toutes les données et analyser les données entre les octets de début.uart haut débit en python

Je sais que Python est capable de gérer 3 Mbauds depuis cet extrait de code montre les positions correctes des octets de début:

ser = serial.Serial('COM3', 3000000, timeout=None) 

_RawData = ser.read(100000) 

for cnt in range(0, 100000, 1): 
    #search for start byte and print the position  
    if(_RawData[cnt] < 128): print(cnt) 

Mais je dois lire en permanence le flux de données, avec cet exemple je lâche des données entre les commandes "ser.read (x)". Donc, je dois comparer les données pendant la lecture du flux:

ser = serial.Serial('COM3', 3000000, timeout=None) 

_RawData = [] 
cnt = 0 

for c in ser.read(): 
    cnt += 1 
    #search for start byte  
    if(c < 128): 
     #print start byte position 
     print(cnt) 

     # -= start thread =- 

     _RawData.clear() 
    _RawData.append(c) 

Mais trouvé que la lecture d'un seul octet est trop lent pour que la vitesse de transmission, la position d'octet de départ est pratiquement généré de manière aléatoire. Est-ce que je peux lire mon flux de données sans perte?

+1

Aucun éditorial sur l'OP, mais c'est hilarant que python ait même la possibilité de parler à un uart. Je suppose que quand tout ce que vous avez est un marteau, tout ressemble à un clou. – nicomp

+0

Le 'print' vous ralentit probablement (le terminal est probablement plus lent que votre uart). Autre que cela, le modèle normal est 'pour chunk dans s.read (chunksize): pour ch dans le morceau: ...' – thebjorn

+1

@ nicomp: Quel est le problème avec UART? C'est toujours le moyen le plus simple d'obtenir des données d'un microcontrôleur sur le PC. Et avec l'aide d'une puce FTDI vous pouvez l'avoir alimenté par USB avec une vitesse jusqu'à 3Mbps. Ce n'est pas parce que c'est un vieux protocole que c'est mauvais. – Mathiable

Répondre

1

Je parviens à le faire fonctionner pour moi. Comme suggéré dans d'autres threads, j'ai implémenté la fonction ser.inWaiting(), qui donne le nombre d'octets en attente dans le buffer d'entrée (qui sur mon système est limité à 4096 Bytes) et lit ce montant depuis uart. Ensuite, je cherchais l'octet de début et commencé un fil pour analyser les données:

ser = serial.Serial('COM3', 3000000, timeout=None) 
_RawData = [] 

while True: 
    #get data in input buffer 
    bytesToRead = ser.inWaiting() 
    Buffer = ser.read(bytesToRead) 

    for cnt in range(0,bytesToRead,1): 
     #search for start byte 
     if(Buffer[cnt] < 128): 
      #print bytes between start bytes 
      print(len(_RawData)) 

      # -= start thread =- 

      _RawData.clear() 

     _RawData.append(Buffer[cnt]) 

    #wait a short time for the buffer to fill  
    time.sleep(0.001) 

Cela semble fonctionner pour l'instant. Merci pour l'aide.