2009-11-25 15 views
2

Je suis nouveau dans le monde de Python et mes compétences en programmation sont assez pauvres, mais je suis en train de trouver un moyen d'utiliser Python pour afficher la sortie d'un circuit EEG (en utilisant le circuit OpenEEG http://openeeg.sourceforge.net)Microprocesseur à l'intrigue en temps réel RS-232 en utilisant PySerial/Matplotlib?

Le La sortie analogique est amplifiée et traitée via un ADC (dans un microcontrôleur ATmega8) et convertie en RS232 par un MAX232.

Le RS232 signal est la suivante:

Octet 1: valeur de synchronisation 0xA5
Byte 2: valeur de synchronisation 0x5A
Byte 3: Version
Byte 4: Numéro de cadre
Byte 5: Voie 1 Faible octet
octet 6: canal 1 octet de poids fort
octet 7: canal 2 octet de poids faible
octet 8: canal 2 octet de poids fort
...
Octets 9-16 sont pour les canaux d'électrodes supplémentaires, mais les données ne sont pas nécessaires puisque seulement en utilisant les deux premiers
...
Byte 17: états des boutons (b1-b4)

J'ai quelques fonctionnalités de base, mais pyserial Je dois trouver un moyen d'utiliser les données entrantes en tamponnant et tracer les valeurs utiles comme 2 formes d'ondes xy en temps réel (temps vs tension)

mise à jour question:

Je reçois le code imprimer avec les quelques lignes évidentes de PySerial mais c'est du charabia. J'essaie de réduire les données au format des valeurs qui peuvent ensuite être tracées. Les 17 octets de données arrivent actuellement à 256 images/sec. Les (deux) canaux sont constitués chacun de 10 bits de données (avec 6 zéros pour constituer le reste des 2 octets). Ils sont non signés en donnant des valeurs possibles de 0 à 1023. Ils correspondent à des valeurs qui doivent être tracées comme positives et négatives, donc une valeur binaire de 512 correspond à un tracé de zéro (micro) volts ....

Comment faire J'ai lu le flux entrant en binaire 8 bits (en supprimant les données dont je n'ai pas besoin), puis combinez les deux octets pertinents de chaque canal que je veux (en supprimant éventuellement les 6 zéros en surplus si nécessaire)?

+0

Quels octets représentent la tension? Quelle est l'importance de l'exigence «en temps réel»? AFAIK, matplotlib ne supporte pas le traçage en temps réel ... – unutbu

+0

Oui, dans une certaine mesure. Mais pour tracer en temps réel quelque chose comme Chaco est probablement la meilleure solution. – nikow

+0

la tension pour chaque canal est représentée par l'octet faible et les 2 LSB de l'octet haut (le reste de l'octet haut est zéros) Un retard serait bien (par exemple une seconde) tant qu'il en affichera quelques-uns secondes valeur sur l'écran, puis peut-être redessiner une nouvelle intrigue. Si je peux seulement afficher des données après qu'elles ont toutes été reçues, alors je pourrais devoir repenser. –

Répondre

2

Pour gérer le format de données binaires compliqué, vous pouvez utiliser structured arrays en numpy (voir également here pour une bonne introduction). Après avoir défini la structure des données, il devrait être très facile à lire. Ensuite, vous pourriez utiliser la fonctionnalité de numpy pour cuire les données selon vos besoins.

2

Il existe un bon exemple de traçage en temps réel here. C'est un bon exemple en ce sens qu'il fonctionne avec des données auto-générées, donc il est facile à tester, mais il est également évident de savoir où modifier le code pour tracer des données réelles, et le code est facile à suivre.

L'idée de base est de faire une fenêtre de tracé, puis mettre à jour ces données en ce qui concerne l'utilisation de

set_xdata(np.arange(len(self.data))) 
set_ydata(np.array(self.data)) 

(Bien que dans les versions actuelles de matplotlib vous pouvez utiliser set_data(xdata, ydata) à la place.En ce qui concerne l'analyse des données de port série, il est probablement préférable de poser cette question en tant que question distincte.