Pergunta

Estou tocando com um rádio XBee, estou usando o Linux (Ubuntu 9.10) e o XBee não parece enviar valores nulos através da porta serial ao usar meu código. Quando uso o programa XCTU (emulador de termos de estoque que vem com o XBEE em uma caixa de janelas separada), vejo essa saída através da porta serial quando um novo XBee se junta à rede:

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

etc ... perfeito. Mas, usando meu código, quando um novo Xbee se junta à rede, vejo isso:

7E 20 95 13 A2 40 3B

Aqui está como estou abrindo a porta serial

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

Eu tenho minhas teorias sobre o que esse código faz, mas minhas teorias estão obviamente erradas. Estou tentando abrir a porta com 9600, 8N1, sem controle de fluxo. Você pode ver que também estou usando o driver serial-> USB, mas como pareço obter dados, tenho certeza de que a parte está funcionando.

Meu palpite é quando eu estou fazendo opções, estou fazendo 0x00 um char de controle? Não tenho certeza. Quando não faço opções BZERO, só posso ler 5 bytes por vez e perco dados. Parece que estou tendo um problema de controle de fluxo ou um problema de taxa de transmissão, então eu bzero () e agora não recebo nulos.

Eu também acabei de usar o Minicom no meu sistema Linux e capturei a saída. Eu recebo as mesmas informações, sem nulos (isso realmente atrapalha os tamanhos de pacotes para aqueles que não estão familiarizados com o protocolo). Meu código poderia definir a porta serial em um estado em que o Minicom não está mudando? Estou perdido.

Obrigado pela ajuda!

Foi útil?

Solução

A inicialização do c_cflags Parece errado, usando negação bit a bit, você basicamente define tudo os pedaços ao lado CRTSCTS:

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

Você deveria simplesmente deixar de fora CRTSCTS Se esse sinalizador não deve ser definido.

Outras dicas

Digi foi lançado xbee_ansic_library, uma biblioteca de código aberto (MPL 2.0) do código ANSI C para se comunicar com os módulos XBEE no modo API. Ele suporta POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (Mingw/MSYS), DOS (OpenWatcom) e algumas plataformas incorporadas.

Pode ser interessante se você ainda estiver escrevendo código C no Ubuntu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top