Последовательный порт не отправляет значения NULL - PullRequest
1 голос
/ 22 декабря 2009

Я играю с радио XBEE, я использую Linux (Ubuntu 9.10), и XBEE, кажется, не передает значения NULL через последовательный порт при использовании кода MY. Когда я использую программу XCTU (стандартный эмулятор, который поставляется с XBEE в отдельном окне Windows), я вижу этот вывод через последовательный порт, когда новый XBEE присоединяется к сети:

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

и т.д ... идеально. Но, используя МОЙ код, когда новый XBEE присоединяется к сети, я вижу это:

7E 20 95 13 A2 40 3B

Вот как я открываю последовательный порт

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

У меня есть свои теории о том, что делает этот код, но мои теории явно ошибочны. Я пытаюсь открыть порт с 9600, 8N1, без контроля потока. Вы можете видеть, что я также использую драйвер serial-> USB, но так как я, кажется, получаю данные, я почти уверен, что эта часть работает.

Полагаю, когда я выбираю bzero, я делаю 0x00 контрольным символом? Я не уверен. Когда у меня нет вариантов bzero, я могу читать только 5 байтов за раз, и я теряю данные. Такое ощущение, что у меня проблемы с управлением потоком данных или скоростью передачи данных, поэтому я использую bzero () и теперь не получаю NULL.

Я также только что использовал Minicom в моей системе Linux и записал вывод. Я получаю ту же информацию, без NULL (это действительно портит размеры пакетов для тех, кто не знаком с протоколом). Мог ли мой код установить последовательный порт в состояние, в котором minicom не меняется? Я потерян.

Спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 22 декабря 2009

Инициализация c_cflags выглядит неправильно, используя побитовое отрицание, вы в основном устанавливаете все биты рядом с CRTSCTS:

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

Вы должны просто пропустить CRTSCTS, если этот флаг не должен быть установлен.

0 голосов
/ 07 декабря 2012

Digi выпустила xbee_ansic_library , библиотеку кода с открытым кодом (MPL 2.0) ANSI C для связи с модулями XBee в режиме API. Он поддерживает POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW / MSYS), DOS (OpenWatcom) и некоторые встроенные платформы.

Это может быть интересно, если вы все еще пишете код на C в Ubuntu.

...