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

StackOverflow https://stackoverflow.com/questions/1943655

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top