Всем доброго дня! Заранее извиняюсь, если тему создал не там, просто она и к QT относится, и к STM32..)
Так, постараюсь максимально не спутанно объяснить ситуацию. Есть плата Blue Pill с STM32F103C8. К ней подключен преобразователь UART-USB, который в Windows определяется как COM-порт. Передаю 14 байт данных с STM32 по UART и пытаюсь ловить их на ПК в простенькой программе на QT (через QSerialPort). Еще дополнительно известен первый байт пакета (заголовок). Так вот принимается почему-то не весь пакет, а только 8 байт, но при этом верные - и стартовый байт и, судя по значениям, остальные 7 байт тоже верные. То есть проблема именно в том, что принимается только часть пакета...
Помогите, пожалуйста, разобраться )
Нужен минимальный пример кода.
В принципе, кода слота приема будет достаточно.
Подключение слота к сигналу:
connect(port, &QSerialPort::readyRead, this, &Handler::portDataReceived);
Внутри слота:
void Handler::portDataReceived() { QByteArray array; array.append(port->readAll()); qDebug() << "bytes: " << array.size(); }
Всегда выводится меньше 14 байт... Чаще всего 8.
@predator это нормальное явление. Нет никаких гарантий, что пакет, отправленный с STM32 одним "заходом", также придет и на ПК, поскольку тут буферизация итд итп. То есть пакет с точки зрения Qt может прийти кусками, нужно в слоте ожидать, когда накопится нужное кол-во байт.
Либо если неизвестен размер принимаемого пакета, но известен последний байт или несколько, то аналогично в слоте ожидаем эти завершающие байты, после чего считаем пакет полностью принятым.
@ai вроде бы суть уловил... Не подскажете, какой пример кода может быть в данном случае для слота?... Спасибо заранее!
const qint8 FRAME_SIZE = 14; void Handler::portDataReceived() { if (port->bytesAvailable() == FRAME_SIZE) { QByteArray array; array.append(port->readAll()); // ..... } }
@ai, огромное СПАСИБО!
Все в точности так сделал - принимается полный пакет, девайс работает )
Нет проблем, обращайтесь )