Pregunta

Estoy jugando con una radio XBEE, estoy usando Linux (Ubuntu 9.10) y el XBEE no aparece para enviar valores NULL a través del puerto serie al utilizar mi código. Cuando utilizo el programa XCTU (emulador de término que viene con el XBEE en una caja de ventanas por separado), veo esta salida a través del puerto serie de nuevas XBEE une a la red:

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

etc ... perfecto. Sin embargo, el uso de mi código, cuando un nuevo XBEE une a la red veo esto:

7E 20 95 13 A2 40 3B

Así es como estoy abriendo el puerto serie

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);

Tengo mis teorías acerca de lo que hace ese código, pero mis teorías son obviamente equivocado. Estoy tratando de abrir el puerto con 9600, 8N1, sin control de flujo. Se puede ver también estoy utilizando el controlador Serial-> USB, pero ya que parece que obtener datos estoy bastante seguro de que una parte está trabajando.

Mi conjetura es cuando bzero opciones, estoy haciendo un char 0x00 control? No estoy seguro. Cuando NO bzero opciones sólo puedo leer 5 bytes a la vez y perder datos. Se siente como que estoy teniendo un control de flujo o un problema de velocidad de transmisión, por lo que bzero () y ahora no consigo valores NULL.

También acabo acostumbrado Minicom en mi sistema Linux y capturó la salida. Me da la misma información, no hay valores NULL (esto realmente puede confundir tamaños de paquetes para aquellos no familiarizados con el protocolo). Podría mi código de haber establecido el puerto serie en un estado que no minicom está cambiando? Estoy perdido.

Gracias por la ayuda!

¿Fue útil?

Solución

La inicialización del c_cflags se ve mal, mediante el uso de negación bit a bit se establece básicamente todos los bits junto CRTSCTS:

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

Usted sólo debe dejar de lado CRTSCTS si esa bandera no se debe establecer.

Otros consejos

Digi ha lanzado biblioteca xbee_ansic_library , un código abierto (MPL 2.0) de código ANSI C para la comunicación con XBee módulos en modo de API. Es compatible con POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW / MSYS), DOS (OpenWatcom) y algunas plataformas embebidas.

Podría ser interesante si todavía está escribiendo código C en Ubuntu.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top