代码之家  ›  专栏  ›  技术社区  ›  Hasan Altay

uint8_t到C中的结构

  •  1
  • Hasan Altay  · 技术社区  · 2 年前

    我使用的是STM32微控制器,通过UART接收数据。我想将接收到的数据转换为Mesaj结构以进行进一步处理。目前,我正在将数据收集到一个缓冲区(RxBuffer)中,我想知道如何将这些数据转换为“Mesaj”结构。这是代码的一部分:

    #define RxBufferSize 50
    uint8_t RxBuffer[RxBufferSize];
    typedef struct {
        uint8_t baslangic;
        uint16_t emirNo;
        uint8_t birimNo;
        uint32_t emirAdresi;
        uint8_t komut;
        uint8_t dataTipi;
        uint32_t data;
        uint8_t bitis;
    } Mesaj;
    

    更多细节 :我在下面的代码片段中收到RxBuffer,我想处理它,但首先,我想在检查RxBuffer的大小后将其转换为结构。

    void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
    {
        if (huart->Instance == USART1)
        {
            HAL_UARTEx_ReceiveToIdle_DMA(&huart1, RxBuffer, RxBufferSize);
            __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
                
                  for (int i = Size; i < RxBufferSize; i++)
            {
                RxBuffer[i] = 0;
            }
                                
            if (Size == 15) 
            {
    
            }
            else
            {
    
            }
        }
    }
    

    任何帮助都将不胜感激。非常感谢。

    1 回复  |  直到 2 年前
        1
  •  3
  •   0___________    2 年前

    使用 memcpy :

    Mesaj *buffToStuct(Mesaj *m, void *buff, size_t offset)
    {
        unsigned char *ucbuff = buff;
        memcpy(m, ucbuff + offset, sizeof(*m));
        return m;
    }
    

    请记住,的格式必须与结构(padding、endianes等)相同。

    如果输入流没有填充包,则使用以下结构:

    typedef struct {
        uint8_t baslangic;
        uint16_t emirNo;
        uint8_t birimNo;
        uint32_t emirAdresi;
        uint8_t komut;
        uint8_t dataTipi;
        uint32_t data;
        uint8_t bitis;
    } __attribute__((packed)) Mesaj;