Domanda

sto giocando con una radio XBEE, sto usando Linux (Ubuntu 9.10) e la XBEE non sembra trasmettere valori NULL attraverso la porta seriale quando si utilizza il mio codice. Quando uso il programma XCTU (magazzino emulatore termine che viene fornito con il XBEE su una scatola di Windows separata), vedo questa uscita tramite la porta seriale in caso di nuove XBEE si unisce alla rete:

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

ecc ... perfetto. Ma, usando il mio codice, in caso di nuove XBEE si unisce alla rete vedo questo:

7E 20 95 13 A2 40 3B

Ecco come sto aprendo la porta seriale

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

Ho le mie teorie su ciò che il codice fa, ma le mie teorie sono ovviamente sbagliato. Sto cercando di aprire la porta con il 9600, 8N1, nessun controllo di flusso. Si può vedere che sto utilizzando anche il driver Serial> USB, ma dal momento che mi sembra di ottenere i dati sono abbastanza sicuro che parte sta lavorando.

La mia ipotesi è quando ho Bzero opzioni, sto facendo un char 0x00 controllo? Non ne sono sicuro. Quando NON Bzero opzioni riesco a leggere solo 5 byte alla volta e ho perdere i dati. Ci si sente come sto avendo un controllo di flusso o un problema di velocità di trasmissione, così ho Bzero () e ora non si ottiene NULL.

Inoltre ho appena usato Minicom sul mio sistema Linux e catturato l'uscita. Ho la stessa informazione, non NULL (questo scombina davvero dimensioni dei pacchetti per chi non conosce il protocollo). Potrebbe essere il mio codice impostare la porta seriale in uno stato che Minicom non cambia? Mi sono perso.

Grazie per l'aiuto!

È stato utile?

Soluzione

L'inizializzazione del c_cflags sembra sbagliato, utilizzando la negazione bit a bit che, fondamentalmente, imposta tutti i bit accanto CRTSCTS:

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

Si dovrebbe solo lasciare fuori CRTSCTS se non deve essere impostato quella bandiera.

Altri suggerimenti

xbee_ansic_library , un Open Source (MPL 2.0) libreria di codice ANSI C per comunicare con XBee moduli in modalità API. Supporta POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW / MSYS), DOS (OpenWatcom) e alcune piattaforme embedded.

Potrebbe essere di interesse se si sta ancora scrivendo codice C in Ubuntu.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top