Я читаю последовательные данные на частоте 250 Гц через последовательный порт.(Я использую USB-последовательный адаптер, если это актуально).Каждый образец составляет 26 байт (столбцы с разделителями табуляции и строки завершаются операторами новой строки.) Я использую скорость 115200 бод. Я поиграл с максимальной длиной буфера для чтения, и в большинстве случаев я получаю 3968 (около 153 выборок).) байт за раз.Я распечатал образцы, чтобы подтвердить, что образцы не сброшены.Я не понимаю, почему он всегда читает ~ 153 сэмпла за раз.В идеале я хотел бы чаще читать меньше семплов: что-то около 10 семплов за раз, таким образом, давая мне более высокую частоту обновления и читая больше «в реальном времени».
До сих пор я пытался снизить максимальный буфердлина добавляет больше задержки при чтении порта, потому что я продолжаю получать данные даже после того, как я перестал отправлять данныеСледующий вопрос кажется актуальным, но я не понимаю, почему это «не проблема». Стандарное поведение входного буфера последовательного порта
#define MAX_DATA_LENGTH 11520
SerialPort::SerialPort(char *portName)
{
...
dcbSerialParameters.BaudRate = CBR_115200;
dcbSerialParameters.ByteSize = 8;
dcbSerialParameters.StopBits = ONESTOPBIT;
dcbSerialParameters.Parity = NOPARITY;
dcbSerialParameters.fDtrControl = DTR_CONTROL_ENABLE;
...
}
int SerialPort::readSerialPort(char *buffer, unsigned int buf_size)
{
DWORD bytesRead;
unsigned int toRead;
ClearCommError(this->handler, &this->errors, &this->status);
if (this->status.cbInQue > 0){
if (this->status.cbInQue > buf_size){
toRead = buf_size;
}
else toRead = this->status.cbInQue;
}
if (ReadFile(this->handler, buffer, toRead, &bytesRead, NULL)) return bytesRead;
return 0;
}
int main()
{
SerialPort arduino(port_name);
std::string temp_buffer;
std::string msg;
while (arduino.isConnected()){
memset(&incomingData[0], 0, sizeof(incomingData));
//Check if data has been read or not
int read_result = arduino.readSerialPort(incomingData, MAX_DATA_LENGTH);
//prints out data
if(read_result > 0){
cout << "Bytes read = " << read_result << endl;
std::string inData(incomingData);
inData = temp_buffer + inData;
int end_idx = inData.rfind('\n');
if(end_idx > 0){
msg = inData.substr(0, end_idx+1);
temp_buffer = inData.substr(end_idx);
}
else{
msg = inData;
}
}
//wait a bit
Sleep(1);
}
}
Когда я установил максимальную максимальную длину буфера, я заметил, что я получаю все выборки с минимальной задержкой между генерацией данных наотправляющая сторона и чтение порта.Когда я уменьшаю его, задержка продолжает накапливаться.
РЕДАКТИРОВАТЬ: я распечатал cbInQue, и оказалось, что это в основном ноль и получает 3968 байт за раз.Таким образом, поступает не непрерывный поток байтов, а, скорее, партия выборок за раз.Это только свойство последовательного устройства или я могу что-то сделать?Когда я читаю это в замазке, это также не является непрерывным, похоже, что данные обновляются каждые несколько миллисекунд.
РЕДАКТИРОВАТЬ: я изменил значение таймера задержки COM-порта из диспетчера устройств.По умолчанию это 16 мс, я изменил его на 2 мс, и теперь я очищаю буфер cbInQue, и он не ждет накопления до 3968 байт.Чтение определенно стало быстрее.Поскольку размер моего буфера ограничен 500, я каждый раз читаю все cbInQue.