簡體   English   中英

將結構轉換為成員類型的指針

[英]Converting struct to pointer of member type

嗨,我是一名學生,電子信息通訊技術,我在I2C項目中遇到了一些麻煩。 我正在使用FreeRTOS作為調度程序。 為了在任務之間傳遞數據,我使用了BaseType_t xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait); 需要一個項目(在我的例子中是一個結構)的方法。 我有3種結構類型,1種是具有有效負載字段的大型機,第二種是有效負載請求(C-APDU格式),最后一個結構是響應有效負載(R-APDU格式)。

下面是我的結構示例。

// mainframe I2C
typedef struct I2CMainFrame
{
    //RF or I2C host to M24SR64-Y:  
    //C-APDU M24SR64-Y to RF or I2C host: R-APDU
    uint8_t DID;    
    uint8_t PCB;    // PCB field
    void *Payload;  // Payload
    uint8_t CRC1;   // 2 CRC bytes
    uint8_t CRC2;
}   I2CMainFrame_t;

// payload request
typedef struct PayloadSend
{
    uint8_t CLA;    // Class byte 0x00: standard command 0xA2: ST comman
    uint8_t INS;    // Instruction byte
    uint8_t P1;     // Param Byte 1
    uint8_t P2;     // Param Byte 2
    uint8_t LC;     // Number of bytes of the Data field
    uint8_t *Data;  // Data bytes
    uint8_t Le;     // Number of bytes to be read in the M24SR64-Y memory
} PayloadSend_t;

// payload response
typedef struct PayloadGet
{
    uint8_t *Data;  // Pointer to data
    uint8_t SW1;    // status byte 1
    uint8_t SW2;    // status byte 2
} PayloadGet_t;

問題是當我想訪問數據時。 我需要傳遞一個指向方法的指針,該方法在I2C總線上逐字節寫入數據或可以計算CRC值,例如:

void CalculateCRC(uint8_t *data, size_t szLen, uint8_t *outputBuffer);
void WriteDataOnI2CBus(uint8_t *data, size_t szLen);

做這樣的事情可行嗎? 我嘗試了以下代碼:

I2C UART任務文件已簡化

I2CMainFrame_t mainframe;
PayloadSend_t payload;

void rtosUartTask(void)
{
    //Fill payloaddata
    uint8 data[] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
    payload.CLA = 0x00;      payload.INS = 0xA4;     payload.P1 = 0x04;
    payload.P2 = 0x00;       payload.LC = 0x07;
    payload.Data = data;     payload.Le = 0x00;

    //fill mainframe data
    mainframe.DID = 0xAC; mainframe.PCB = 0x02;
    mainframe.Payload = &payload;

    //methode for passing struct to I2C task
    xQueueSend(I2CQueue, &mainframe,0);
}

I2C UART任務文件已簡化

I2CMainFrame_t mainframe;

void rtosUartTask(void)
{
     //Task manager starts this method when there is a item in the queue
     xQueueReceive(I2CQueue, &mainframe, portMAX_DELAY);
     //This doesnt work
     uint8_t *pointerToStructMembers = &mainframe;
     WriteDataOnI2CBus(pointerToStructMembers, sizeof(mainframe));
}

我在這里尋找正確的方向還是應該嘗試其他方法?

uint8_t *pointerToStructMembers = &mainframe;

您不能使用類型轉換,因為I2CMainFrame包含指針成員void *Payload

您可以嘗試按以下步驟序列化mainframe

聲明一個uint8_t數組,然后將內容單獨復制到其中。

uint8_t bufferedStructMembers[sizeof(I2CMainFrame_t) + sizeof (PayloadSend_t) + ((PayloadSend_t *)(mainframe.Payload))->LC];


bufferedStructMembers[0] = mainframe.DID;    
bufferedStructMembers[1] = mainframe.PCB;
bufferedStructMembers[2] = ((PayloadSend_t *)(mainframe.Payload))->CLA;
bufferedStructMembers[3] = ((PayloadSend_t *)(mainframe.Payload))->INS;
bufferedStructMembers[4] = ((PayloadSend_t *)(mainframe.Payload))->P1;
bufferedStructMembers[5] =  ((PayloadSend_t *)(mainframe.Payload))->P2;
bufferedStructMembers[6] = ((PayloadSend_t *)(mainframe.Payload))->LC;
memcpy(&bufferedStructMembers[7], ((PayloadSend_t *)(mainframe.Payload))->Data, ((PayloadSend_t *)(mainframe.Payload))->LC);
bufferedStructMembers[((PayloadSend_t *)(mainframe.Payload))->LC+7] =  mainframe.Le;
bufferedStructMembers[((PayloadSend_t *)(mainframe.Payload))->LC+8] =  mainframe.CRC1;   // 2 CRC bytes
bufferedStructMembers[((PayloadSend_t *)(mainframe.Payload))->LC+9] =  mainframe.CRC2;


WriteDataOnI2CBus(bufferedStructMembers, sizeof(mainframe));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM