QextSerialPort Читать вопрос - PullRequest
2 голосов
/ 09 октября 2011

Я сталкиваюсь со странным поведением 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 Ответ

1 голос
/ 10 октября 2011

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

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

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

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

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

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

...