У меня есть датчик, который использует 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))