Top.Mail.Ru
Уведомления
Очистить все

[Решено] Прием пакета от STM32 из COM-порта в QT.

(@predator)
Level 1

Всем доброго дня! Заранее извиняюсь, если тему создал не там, просто она и к QT относится, и к STM32..)

Так, постараюсь максимально не спутанно объяснить ситуацию. Есть плата Blue Pill с STM32F103C8. К ней подключен преобразователь UART-USB, который в Windows определяется как COM-порт. Передаю 14 байт данных с STM32 по UART и пытаюсь ловить их на ПК в простенькой программе на QT (через QSerialPort). Еще дополнительно известен первый байт пакета (заголовок). Так вот принимается почему-то не весь пакет, а только 8 байт, но при этом верные - и стартовый байт и, судя по значениям, остальные 7 байт тоже верные. То есть проблема именно в том, что принимается только часть пакета...

Помогите, пожалуйста, разобраться )

Цитата
Создатель темы Размещено : 20.09.2021 12:49
AI
 AI
(@ai)
Level 3 Moderator

Нужен минимальный пример кода.

ОтветитьЦитата
Размещено : 20.09.2021 13:53
AI
 AI
(@ai)
Level 3 Moderator

В принципе, кода слота приема будет достаточно.

ОтветитьЦитата
Размещено : 20.09.2021 14:44
(@predator)
Level 1

@ai

Подключение слота к сигналу:

connect(port, &QSerialPort::readyRead, this, &Handler::portDataReceived);

Внутри слота:

void Handler::portDataReceived()
{
	QByteArray array;
	array.append(port->readAll());
	qDebug() << "bytes: " << array.size();
}

Всегда выводится меньше 14 байт... Чаще всего 8.

ОтветитьЦитата
Создатель темы Размещено : 21.09.2021 11:42
AI
 AI
(@ai)
Level 3 Moderator

@predator это нормальное явление. Нет никаких гарантий, что пакет, отправленный с STM32 одним "заходом", также придет и на ПК, поскольку тут буферизация итд итп. То есть пакет с точки зрения Qt может прийти кусками, нужно в слоте ожидать, когда накопится нужное кол-во байт.

Либо если неизвестен размер принимаемого пакета, но известен последний байт или несколько, то аналогично в слоте ожидаем эти завершающие байты, после чего считаем пакет полностью принятым.

ОтветитьЦитата
Размещено : 21.09.2021 18:18
(@predator)
Level 1

@ai вроде бы суть уловил... Не подскажете, какой пример кода может быть в данном случае для слота?... Спасибо заранее!

ОтветитьЦитата
Создатель темы Размещено : 22.09.2021 16:43
AI
 AI
(@ai)
Level 3 Moderator
const qint8 FRAME_SIZE = 14;

void Handler::portDataReceived()
{
    if (port->bytesAvailable() == FRAME_SIZE)
    {
        QByteArray array;
        array.append(port->readAll());
		
		// .....
	}
}
ОтветитьЦитата
Размещено : 24.09.2021 20:13
(@predator)
Level 1

@ai, огромное СПАСИБО!

Все в точности так сделал - принимается полный пакет, девайс работает )

ОтветитьЦитата
Создатель темы Размещено : 26.09.2021 17:26
AI
 AI
(@ai)
Level 3 Moderator

Нет проблем, обращайтесь )

ОтветитьЦитата
Размещено : 26.09.2021 18:43
Поделиться: