Отправка и получение данных с ПК через проблему UART to STM32 - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь отправить (несколько строк данных) шестнадцатеричные данные с ПК на 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-ярлык = (

...