Последовательный порт не отправляет значения NULL

Я играю с радио XBEE, я использую Linux (Ubuntu 9.10), и XBEE, похоже, не отправляет значения NULL через последовательный порт при использовании МОЕГО кода. Когда я использую программу 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, No Flow control. Вы можете видеть, что я также использую драйвер serial-> USB, но поскольку мне кажется, что я получаю данные, я почти уверен, что эта часть работает.

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

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

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


person ryanday    schedule 22.12.2009    source источник
comment
Вы очистили массив c_cc[]? Это может позволить передавать нули (и другие управляющие символы). У вас есть встроенный (не USB) последовательный порт, который можно использовать для проверки, что проблема не в драйвере USB?   -  person Adam Liss    schedule 22.12.2009


Ответы (2)


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

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

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

person sth    schedule 22.12.2009
comment
Мало того, что это сработало, моя функция контрольной суммы сработала с первого раза! Шаг 2, попробуйте оператор ~. - person ryanday; 22.12.2009

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.

person tomlogic    schedule 07.12.2012