2016-01-20 2 views
0

Je suis un débutant de traitement et j'essaye de tracer quelques données reçues du port série. J'ai beaucoup d'accéléromètres (~ 10) et je vérifie que l'esquisse reçoit toutes les données à 100Hz. Je ne veux tracer que les données d'un accéléromètre à la fois. Si je transmets les données d'un seul accéléromètre, l'intrigue fonctionne parfaitement, mais si j'essaie de diffuser trois d'entre elles (en traçant seulement le premier), l'intrigue fonctionne saccadée. La chose étrange se produit quand j'essaie de diffuser 4 ou plus d'entre eux, parce que de manière inattendue, l'intrigue commence à fonctionner de mieux en mieux quand j'augmente le nombre d'accéléromètres en streaming.intrigue temps réel Jerky à partir du port série (interface UART USB - FTDI) dans le traitement

Je remarque que serialEvent() et draw() fonctionnent correctement sur deux threads indipendents, mais leur alternance change de manière étrange lorsque j'ajoute plus d'accéléromètres.

Dans la pire des conditions, si j'imprime le System.currentTimeMillis() pour le draw() ["#" symbole] et le "add-value-du-premier-accéléromètre-au-tableau () » à l'intérieur du serialEvent() [ "symbole _"] J'ai quelque chose comme:

#1453211104631 
#1453211104648 
#1453211104664 
#1453211104681 
#1453211104698 
#1453211104714 
#1453211104730 
#1453211104747 
#1453211104765 
#1453211104782 
#1453211104797 
#1453211104813 
#1453211104832 
#1453211104847 
#1453211104864 
#1453211104882 
#1453211104897 
#1453211104914 
#1453211104931 
#1453211104948 
#1453211104964 
#1453211104982 
#1453211104998 
_1453211105000 
_1453211105000 
_1453211105000 
_1453211105000 
_1453211105001 
_1453211105001 
_1453211105001 
_1453211105001 
_1453211105002 
_1453211105002 
_1453211105002 
_1453211105002 
_1453211105002 
_1453211105003 
_1453211105003 
_1453211105003 
_1453211105003 
_1453211105003 
_1453211105004 
_1453211105004 
_1453211105004 
_1453211105004 
_1453211105005 
_1453211105005 
_1453211105005 
_1453211105005 
_1453211105005 
_1453211105006 
_1453211105006 
_1453211105006 
_1453211105006 
_1453211105006 
_1453211105007 
_1453211105008 
_1453211105008 
_1453211105008 
_1453211105008 
_1453211105008 
_1453211105009 
#1453211105014 
#1453211105032 
#1453211105049 
#1453211105064 
#1453211105082 
#1453211105097 
#1453211105114 
#1453211105130 
#1453211105148 
#1453211105165 
#1453211105181 
#1453211105198 
#1453211105214 

donc à # 1453211105014 tirage au sort() tracer les 39 points précédents (~ 390ms) en un seul coup, alors rien pour 200ms et puis un autre bloc de points et ainsi de suite. L'effet final est un tracé saccadé des données.

Cela ne se produit pas lorsque l'esquisse reçoit peu de données (un accéléromètre) ou beaucoup de données (plus de 6 accéléromètres).

Où est-ce que je me trompe?

Merci beaucoup pour toute aide!

+0

Pouvez-vous publier un [MCVE] (http://stackoverflow.com/help/mcve)? Cela peut être difficile avec l'événement serial, mais vous pouvez essayer de créer un thread qui s'ajoute à une série de 'ArrayLists'. Nous avons au moins besoin de voir du code. Mais je ne suis pas sûr de comprendre votre question: où sont les 200ms dont vous parlez? Notez également que la fonction 'println()' est très lente, donc imprimer beaucoup de choses par seconde peut gâcher le timing de votre code. –

+0

Désolé mais peut-être mon explication n'était pas claire. Je veux dire que pendant 200 ms (de # 1453211105014 à # 1453211105214) les tracés de dessin 13 fois les 39 points (aucune nouvelle donnée n'est arrivée, en fait il n'y a aucun événement de la série). Puis d'autres ~ 40 points arrivent dans ~ 10ms (40 événements de série) et le tirage au sort va représenter ~ 15 fois le même ~ 79 points. Et ainsi de suite ... – Mark

+0

Comment êtes-vous sûr que la fonction 'draw()' et la fonction 'serialEvent()' se produisent sur deux threads différents? Comment savez-vous qu'ils sont sur deux threads différents? –

Répondre

1

Je trouve la solution! Je dois modifier les paramètres de l'interface USB UART (FTDI). Enfait J'ai trouvé que la latence des données est liée à la taille du tampon USB et au temporisateur de latence (Gestionnaire de périphériques -> Ports COM -> Port série USB -> Propriétés -> Avancé). Pour plus d'informations: http://www.ftdichip.com/Support/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf.

J'espère que cela pourrait être utile!