Здравствуйте, имеется задача передачи данных от stm32 на ПК и от ПК в stm по UART. Имеется stm32f411e-disco, созданная программа на пк в Qt creator. UART передатчик - CH340. Программа для stm - Keil, настройка в cubeMX.
Основные выдержки из кода Qt (mainwindow.cpp):
C++ (Qt)Выделить код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
// Настройка UART serial = new QSerialPort(this); serial->setPortName("com4"); serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); /*serial->write("ok*"); */ connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived())); // Запись принятых даннх в текстовое окно void MainWindow::serialReceived() { QByteArray ba; ba=serial->readAll(); ui->label->setText(ba); qDebug()<<ba; } // Отправка "1" и "2" в зависимости от нажатой кнопки void MainWindow::on_pushButton_clicked() { serial->write("1"); } void MainWindow::on_pushButton_2_clicked() { serial->write("2"); }
Настроен UART на прием и передачу. При нажатии какой-либо кнопки по UART передаётся 1 или 2ка. Так же принятая информация отображается в текстовом окне label. При замыкании RX и TX у CH340 отправленная 1 или 2 тут же принимаются программой.
Программный код для stm создан в CubeMX. Там подключено два UART, один на приём, другой на передачу (можно настроить один для работы в 2 направления).
Основные выдержки из кода Keil (main.c):
//Настройка UART
serial = new QSerialPort(this);
serial->setPortName("com4");
serial->setBaudRate(QSerialPort::Baud115200);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
serial->open(QIODevice::ReadWrite);
/* serial->write("ok*"); */ // Transmiting "ок" to COM Port
connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived()));
// Отображение принятых данных в текстовом меню label
void MainWindow::serialReceived()
{
QByteArray ba;
ba=serial->readAll();
ui->label->setText(ba);
qDebug()<<ba;
}
// Отправка 1 или 2 в зависимости от нажатой кнопки
void MainWindow::on_pushButton_clicked()
{
serial->write("1");
}
void MainWindow::on_pushButton_2_clicked()
{
serial->write("2");
}
Выдержки из кода в Keil (main.c):
// Настройка UART
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
// 2 массива для принятия и отправки данных
uint8_t strTX[1];
uint8_t strRX[1];
// Попытка сделать что-то адекватное
int strTX = 1;
while(1) {
HAL_UART_Transmit_IT(&huart2, (uint8_t*) strTX, 1);
HAL_UART_Receive_IT(&huart2, (uint8_t*) strTX, 1);
Код в keil явно кривой, в Qt вроде всё работает. Получается передать из stm в Qt, но из Qt в stm нет.
Нужно получить следующее: нажимаем в Qt одну из двух кнопок, отправляется в stm либо 1, либо 2 в зависимости от выбранной кнопки. Stm принимает, обрабатывает, если 1, то загорается один светодиод, если 2, то другой. Дальше stm отправляет обратно в Qt информацию о том, какой светодиод загорелся.
P.S: довольно далек от программирования, но стараюсь разобраться. Буду благодарен любой помощти, некоторые скриншоты прилагаю.