Последовательный порт не отправляет значения NULL
-
20-09-2019 - |
Вопрос
Я играю с радио 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.Вы можете видеть, что я также использую драйвер последовательного порта->USB, но, поскольку мне кажется, что я получаю данные, я почти уверен, что эта часть работает.
Я предполагаю, что когда у меня нет параметров, я делаю 0x00 управляющим символом?Я не уверен.Когда у меня НЕТ нулевых опций, я могу читать только 5 байт за раз и теряю данные.Такое ощущение, что у меня проблема с управлением потоком или скоростью передачи данных, поэтому я использую bzero() и теперь не получаю NULL.
Я также только что использовал Minicom в своей системе Linux и записал результат.Я получаю ту же информацию, без NULL (это действительно портит размеры пакетов для тех, кто не знаком с протоколом).Мог ли мой код перевести последовательный порт в состояние, в котором minicom не меняется?Я заблудился.
Спасибо за помощь!
Решение
Инициализация c_cflags
выглядит неправильно, используя побитовое отрицание, вы в основном устанавливаете все биты рядом CRTSCTS
:
options.c_cflag = ... | ~CRTSCTS | ...;
Вы должны просто оставить CRTSCTS
если этот флаг не должен быть установлен.
Другие советы
Диги выпустила xbee_ansic_library, библиотека с открытым исходным кодом (MPL 2.0) кода ANSI C для связи с модулями XBee в режиме API.Он поддерживает POSIX (Linux, BSD, Mac OS X, Cygwin), Windows (MinGW/MSYS), DOS (OpenWatcom) и некоторые встроенные платформы.
Это может быть интересно, если вы все еще пишете код C в Ubuntu.