Я пытаюсь отправить (несколько строк данных) шестнадцатеричные данные с ПК на STM32, используя соединение UART.
Слово выглядит так:
FF18E2054605A11661EE
FF4353454605A11661EE
FF18E2564645A11661EE
FF18E2054667876861EE
...
(0xFF и 0xEE - начальный и конечный байты)
Если я отправляю его через консоль CuteCom, он отлично работает (я получаю данные и сохраняю их в двумерном массиве)
Если я использую программу QT (которая должна преследовать ту же цель), она не работает, пожалуйста, помогите найти ошибку!
(сторона ПК) QT:
static uint16_t m1 = 0;
static uint16_t m2 = 0;
static uint16_t m3 = 0;
static uint16_t m4 = 0;
static QByteArray hextest;
if(lines.at(i).contains(",")){
while(lines.at(i+j) != "\n"){
QStringList speed_chunks = lines.at(i+j).split(",");
uart = speed_chunks.at(2)+speed_chunks.at(3)+speed_chunks.at(4)+speed_chunks.at(5) +"\0";
m1 = speed_chunks.at(2).toInt();
m2 = speed_chunks.at(3).toInt();
m3 = speed_chunks.at(4).toInt();
m4 = speed_chunks.at(5).toInt();
hextest.resize(8);
hextest[0]=255;
hextest[1]=m1>>8;
hextest[2]=m1;
hextest[3]=m2>>8;
hextest[4]=m2;
hextest[5]=m3>>8;
hextest[6]=m3;
hextest[6]=m4>>8;
hextest[8]=m4;
hextest[9]=238;
qDebug()<< uart;
qDebug()<< hextest.toHex();
m_serial.write(hextest.toHex());
m_serial.waitForBytesWritten(1000);
QThread::usleep(2000000);
j++;
}
i += j;
}
(сторона STM32) C-код:
void USART2_IRQHandler() {
if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET) { //Checks whether the specified USART interrupt has occurred
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Clears the USART2 interrupt pending bits
static int string_cnt = 0; //Initialisation of string counter
char uart_input = USART2->DR; //Initialisation a char variable with USART Data register
if (uart_input == 0xff) { //If a string = 0xff > first Letter
string_cnt = 0; //String_cnt reset
}
if (string_cnt < 10) { //If string_cnt < 10 letters ->
received_str[string_cnt++] = uart_input; //receive next letter
}
if (string_cnt >= 10 && received_str[0] == 0xff && received_str[9] == 0xee) { //If string_cnt >= 10 units and first unit = 0xff & last = 0xee ->
receive_done_flag = TRUE; //receive_done_flag = true
}
}
}
while(h<5000){
if (receive_done_flag == TRUE){
testarrays[0][h]=((uint16_t)received_str[1] << 8) | received_str[2];
testarrays[1][h]=((uint16_t)received_str[3] << 8) | received_str[4];
testarrays[2][h]=((uint16_t)received_str[5] << 8) | received_str[6];
testarrays[3][h]=((uint16_t)received_str[7] << 8) | received_str[8];
h++;
receive_done_flag=FALSE;
}
Итак, testarrays[0][x]
для разных данных x hex становится одним и тем же значением (полученный_строк не получает новых данных)
Спасибо!
P.S. Как насчет форматирования при использовании Chrome? Strg + K больше не работает, конечно, Chrome-ярлык = (