QextSerialPort Читать вопрос

Я сталкиваюсь со странным поведением readyRead(). Я использую QextSerialPort для своей последовательной связи и подключаю readyRead () к своему слоту для чтения. Например, я записываю 45 байтов в порт и ожидаю чтения 45 байтов, но что происходит, мой сигнал readyRead () посылается более одного раза, то есть сначала он читает 38 байтов, а затем читает 7 байтов. Как я могу заставить это прочитать весь кусок данных?

//Port setup
m_pSerialPort = new QextSerialPort(pduPortName, m_PortSettings, QextSerialPort::EventDriven);
m_pSerialPort->setBaudRate(m_PortSettings.BaudRate);
m_pSerialPort->setDataBits(m_PortSettings.DataBits);
m_pSerialPort->setFlowControl(m_PortSettings.FlowControl);
m_pSerialPort->setParity(m_PortSettings.Parity);
m_pSerialPort->setStopBits(m_PortSettings.StopBits);
m_pSerialPort->setTimeout(500);
m_pSerialPort->flush();
m_pSerialPort->open(QIODevice::ReadWrite | QIODevice::Unbuffered );
connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readSerialData()));

//write 
qint64 bytesWritten = pSerialPort->write(data, bytes_to_write);

//Read 
qint64 availableBytes = pSerialPort->bytesAvailable();
if (availableBytes >= SIZE) 
     bytesRead = pSerialPort->read(data , availableBytes);

Надеюсь, я хорошо объяснил свою проблему. Пожалуйста помоги!

Примечание: я использую протокол STANAG для своих сообщений.

1 ответ

Некоторые коммуникационные устройства имеют только очень маленькие встроенные буферы. В результате вы очень часто получаете данные только небольшими пакетами.

Многие приемопередатчики GPS работают таким образом, и многие из них одновременно генерируют около половины ак (512 байт) данных.

Весьма вероятно, что последовательная микросхема в вашем устройстве жестко подключена, чтобы возвращать только столько байтов за раз, и в результате вам нужно будет продолжать чтение порта до тех пор, пока байт Доступный вызов не вернет 0 байтов для чтения.

Я не могу вспомнить код / ​​os-вызовы на моей голове, но вы могли бы взглянуть на SDK вашего устройства и посмотреть, упоминает ли он что-нибудь об увеличении / уменьшении размеров буфера на устройстве, если это так увеличение, которое может увеличить количество данных, возвращаемых за один удар.

Однако нередко иметь большой буфер в вашем приложении и постепенно заполнять его повторяющимися вызовами на устройство для сбора данных.

Поскольку вы обнаружили, что команда "sleep" также заставляет вещи работать, то это может быть не проблемой размера буфера, а тем, что устройство заполняет свой буфер данных намного медленнее, чем ваше приложение / компьютер. читая это.

Другие вопросы по тегам