Почему количество байтов, считываемых из заглушки последовательного порта при определенном числе? - PullRequest
0 голосов
/ 09 апреля 2019

Я читаю последовательные данные на частоте 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.

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