【问题标题】:Receiving Hex data from terminal using UART interference使用 UART 干扰从终端接收十六进制数据
【发布时间】:2021-07-11 12:38:15
【问题描述】:

我想从终端接收十六进制数据,例如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。通常我们可以通过 UART 接收字符串形式的消息。但我想从终端接收十六进制数据而不是字符或字符串。我正在使用 stm32cubemx HAL 库。

谁能给我一个解决方案,告诉我如何实现这个?

【问题讨论】:

  • Sprintf() 应该能帮到你
  • 没有像“十六进制数据”这样的东西。终端输入0xee字符码会比较麻烦。
  • “通常我们可以通过 UART 接收字符串中的消息” -- 您混淆了字符代码和用于这些代码的二进制值。 UART 每帧传输 5 到 9 位数据。 8 个数据位(一个字节)的帧是最常见的。每帧的值可以表示为二进制、八进制、十进制或十六进制数。或者该值可以被视为字符代码,例如ASCII,然后由终端仿真程序显示。那么你想对收到的数据做什么呢?
  • 我需要将接收到的数据存储在缓冲区中,然后该缓冲区将作为 CAN_TX 消息发送。而且我不允许使用终端仿真程序将数据显示为十六进制。相反,我必须提供十六进制数据作为输入,这就是问题所在。我希望你们能理解我的问题。

标签: hex stm32 uart


【解决方案1】:

所以,我终于找到了解决方案。实际任务是通过 UART 从终端接收十六进制数据,如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。收到十六进制值后,我需要通过 CAN 控制器传输这些值。所以,基本上有两个主要任务。

  1. 从终端接收十六进制值
  2. 存储十六进制值并通过 CAN 总线发送。

实际上我对第一个任务有问题。为了解决这个问题,我首先将字符串拆分为十六进制字符串,其中每个字符串仅包含一个十六进制值。如果字符串类似于“12 34 aa bb cc 33 77 86”。令牌将类似于“12”“34”“aa”“bb”“cc”“33”“77”“86”。为此,我使用了 strtok() 函数。然后存储该标记并使用另一个函数 strtol() 将其转换为十六进制表示。 正确完成后,只需在 CAN 传输函数中发送值即可。

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // Callback-Funktion für Empfangs interrupt
{
    HAL_UART_Receive_IT(&huart2,&recvd_data,1);        //  Empfangs interrupt funktion

     if(recvd_data == '\r')                         //   wenn "Enter" gedrückt wird, ist der Empfang abgeschlossen
         {
             reception_complete = TRUE;

                    char *args[15];
                    int i =0; int j=0;
                    char *token = strtok(data_buffer, " \t\n");
                    while (token != NULL) {
                        args[i++] = token;
                        token = strtok(NULL, " \t\n");
                    }
                    //to print the array
                    for (j = 0; j < i; j++) {
                        printf("%s\r\n", args[j]);
                    }


             int  hexbase0=(int) strtol (args[0],NULL,16);
             int  hexbase1=(int) strtol (args[1],NULL,16);
             int  hexbase2=(int) strtol (args[2],NULL,16);
             int  hexbase3=(int) strtol (args[3],NULL,16);
             int  hexbase4=(int) strtol (args[4],NULL,16);
             int  hexbase5=(int) strtol (args[5],NULL,16);
             int  hexbase6=(int) strtol (args[6],NULL,16);
             int  hexbase7=(int) strtol (args[7],NULL,16);
             int  hexbase8=(int) strtol (args[8],NULL,16);
             //printf("%x\r\n",hexbase);


             //asciitobinary(data_buffer);
             TxData[0] = hexbase1;
             TxData[1] = hexbase2;
             TxData[2] = hexbase3;
             TxData[3] = hexbase4 ;
             TxData[4] = hexbase5;
             TxData[5] = hexbase6;
             TxData[6] = hexbase7;
             TxData[7] = hexbase8;



             TxHeader.IDE = CAN_ID_STD;
             TxHeader.StdId = hexbase0;
             TxHeader.RTR = CAN_RTR_DATA;
             TxHeader.DLC = 8;

              if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, (uint8_t*)TxData, &TxMailbox) != HAL_OK)
                         {
                             Error_Handler ();
                         }

             //HAL_UART_Transmit(huart,data_buffer,count,HAL_MAX_DELAY);
             data_buffer[count++]='\r';

             for(count=10; count>0; count--)                        //buffer leer machen
              {
                 data_buffer[count]=0;
              }
         }
         else
         {
             data_buffer[count++] = recvd_data;
         }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2017-05-07
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2023-03-03
    相关资源
    最近更新 更多