Данные 100 Гц из последовательного - PullRequest
2 голосов
/ 16 февраля 2012

У меня есть датчик, который использует RS422, чтобы выплевывать сообщения через последовательный порт. (Я думаю, что это правильная терминология.) В любом случае, я сделал свой жгут проводов и подключил его к своему RS422 к USB-конвертеру и Тада, я получил данные в гипертерминале. Хорошие вещи.

Теперь датчик имеет нечетную скорость передачи 1500 кбит / с. Я делаю это в Windows, так что на самом деле установить скорость передачи данных не сложно. Первоначально при включении датчик отправляет 69-байтовое сообщение каждые 10 Гц. Я вижу это сообщение, правильные байты читаются, и сообщение очень точное (оно включает временную метку, которая ожидает его, увеличивается на 0,1 с каждое сообщение!) НАИБОЛЕЕ ВАЖНО, я получаю сообщение на его границе, другими словами каждое чтение было новым сообщением.

В любом случае, пока все идет хорошо, поэтому я сделал следующий шаг и отправил команду записи через последовательный порт, чтобы активировать сообщение данных датчика. Это сообщение имеет размер 76 байт и отправляется с частотой 100 Гц. Успех снова, больше данных начинает появляться в чтениях. Тем не менее, я не получаю его на 100 Гц, я получаю блоки 3968 байт. Если я уменьшу свой буфер, я получу три очень очень быстрых чтения 1024, а затем сразу 896 (снова 3968 байт). (Обратите внимание, что сейчас я получаю два сообщения, одно с частотой 10 Гц с размером 69 и одно с частотой 100 Гц с размером 76, обратите внимание, что ни одна из этих двух сообщений не делит равномерно 3968.)

Мой вопрос: где-то что-то буферизует мои 100 Гц сообщения, и я не получаю их, когда они принимаются. Я хотел бы изменить это, но я не знаю, что я ищу. Мне не нужно это сообщение 100 Гц на его границе, я просто не хочу его на 2 Гц. Я был бы счастлив с 30 Гц или даже 20 Гц.


Ниже я включаю свой код настройки последовательного порта:

Порт открыт

 serial_port_ = CreateFile(L"COM6", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

CommState и Timeouts

 COMMTIMEOUTS comm_timeouts;
 ZeroMemory(&comm_timeouts, sizeof(COMMTIMEOUTS));
 //comm_timeouts.ReadIntervalTimeout = MAXDWORD; //Instant Read, still get 3968 chunks
 comm_timeouts.ReadIntervalTimeout = 1; //1ms timeout
 comm_timeouts.ReadTotalTimeoutConstant = 1000; //Derp?
 comm_timeouts.WriteTotalTimeoutConstant = 5000; //Derp.
 SetCommTimeouts(serial_port_, &comm_timeouts);

 DCB dcb_configuration;
 ZeroMemory(&dcb_configuration, sizeof(DCB));
 dcb_configuration.DCBlength = sizeof(dcb_configuration);
 dcb_configuration.BaudRate = 1500000;
 dcb_configuration.ByteSize = 8;
 dcb_configuration.StopBits = ONESTOPBIT;
 dcb_configuration.Parity = ODDPARITY;
 if(!SetCommState(serial_port_, &dcb_configuration))

My Read

 if(!ReadFile(serial_port_, read_buffer_, 1024, &bytes_read, NULL))

1 Ответ

3 голосов
/ 16 февраля 2012

Я подозреваю, что ваш serial-> usb конвертер выполняет буферизацию. Поскольку usb основан на пакетах, он должен выполнить некоторую буферизацию. На частоте 10 Гц, вероятно, достаточно большие задержки для очистки буфера после каждого сообщения. Но при 100 Гц сообщения приходят так далеко, что он очищает буфер по какой-то другой логике.

Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...