2009-12-22 18 views
1

Je joue avec une radio XBEE, j'utilise Linux (Ubuntu 9.10) et le XBEE ne semble pas envoyer de valeurs NULL via le port série lors de l'utilisation de mon code. Lorsque j'utilise le programme XCTU (émulateur de stock à long terme qui vient avec la XBEE sur une boîte de fenêtres séparées), je vois cette sortie via le port série lorsqu'une nouvelle XBEE rejoint le réseau:Le port série n'envoie pas de valeurs NULL

7E 00 20 95 00 13 A2 00 40 3B 

etc ... parfait . Mais, en utilisant mon code, lorsqu'une nouvelle XBEE rejoint le réseau que je vois ceci:

7E 20 95 13 A2 40 3B 

Voici comment j'ouvre le port série

struct termios options; 
int port; 

port = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK); 
tcgetattr(port, &options); 
bzero(&options, sizeof(options)); 

options.c_cflag = B9600 | ~CRTSCTS | CS8 | CLOCAL | CREAD; 

tcsetattr(port, TCSANOW, &options); 

J'ai mes théories sur ce que le code ne , mais mes théories sont évidemment fausses. J'essaye d'ouvrir le port avec 9600, 8N1, aucun contrôle de flux. Vous pouvez voir que j'utilise aussi le pilote serial-> USB, mais comme j'ai l'impression d'avoir des données, je suis sûr que cette partie fonctionne.

Ma conjecture est quand je bzero options, je fais 0x00 un char de contrôle? Je ne suis pas sûr. Quand je ne bosse pas, je ne peux lire que 5 octets à la fois et je perds des données. J'ai l'impression d'avoir un contrôle de flux ou un problème de débit en bauds, donc je bzero() et maintenant je n'ai plus de NULL.

J'ai aussi simplement utilisé Minicom sur mon système Linux et capturé la sortie. Je reçois la même information, pas de valeurs NULL (cela gâche vraiment les tailles de paquets pour ceux qui ne connaissent pas le protocole). Est-ce que mon code aurait pu mettre le port série dans un état que minicom ne change pas? Je suis perdu.

Merci pour l'aide!

+0

Avez-vous effacé le tableau 'c_cc []'? Cela peut permettre aux nulls (et autres caractères de contrôle) d'être transmis. Avez-vous un port série intégré (non USB) que vous pouvez utiliser pour détecter le problème qui ne se trouve pas dans le pilote USB? –

Répondre

6

L'initialisation du c_cflags semble erroné, en utilisant la négation vous définissez essentiellement bitwise tous les bits à côté CRTSCTS:

options.c_cflag = ... | ~CRTSCTS | ...; 

Vous devez juste laisser de côté CRTSCTS si ce drapeau ne doit pas être réglé.

+0

Non seulement cela a fonctionné, mais la fonction checksum a fonctionné pour la première fois! Étape 2, grok l'opérateur ~. – ryanday

0

Digi a publié , une bibliothèque Open Source (MPL 2.0) de code ANSI C pour communiquer avec les modules XBee en mode API. Il supporte POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW/MSYS), DOS (OpenWatcom) et certaines plateformes embarquées.

Cela peut être intéressant si vous écrivez toujours du code C dans Ubuntu.