我在c中声明了一个函数:
void SendMsg(TXMsg_t *TXMsg);
这是结构:
typedef struct
{
uint16_t DestAddr;
uint16_t PayloadLength;
uint8_t Payload[512];
} TXMsg_t;
我可以手动填充TXMsg.Payload
,致电SendMsg(&TXMsg);
,它运行正常。但在一种情况下,我有一个调用SendMsg的中间函数:
void main(void)
{
uint16_t Addr = 0x1234;
uint16_t TXLength = 0x0004;
uint8_t TXData[4] = {0xAA, 0xBB, 0xCC, 0xDD};
MiddleFunction(Addr, TXLength, TXData);
}
void MiddleFunction(uint16_t Addr, uint16_t TXLength, uint8_t *TXData);
{
TXMsg_t TXMsg;
TXMsg.DestAddr = Addr;
TXMsg.PayloadLength = TXLength;
TXMsg.Payload = TXData; // This is the problem!!!
SendMsg(&TXMsg);
}
这给了我一个错误:“赋值给带数组类型的表达式。”
我的目标是简单地将指针发送到TXData并将其传递给我的SendMsg函数。这是一个嵌入式应用程序,我不想花时间或内存来实际复制数据...
我该怎么做?
答案 0 :(得分:2)
您需要使用memcpy
将字节从一个数组复制到另一个数组。您还需要传递TXData
中MiddleFunction
数组的大小:
int main(void) // main must return int
{
uint16_t Addr = 0x1234;
uint16_t TXLength = 0x0004;
uint8_t TXData[4] = {0xAA, 0xBB, 0xCC, 0xDD};
MiddleFunction(Addr, TXLength, TXData, sizeof(TXData));
}
void MiddleFunction(uint16_t Addr, uint16_t TXLength, uint8_t *TXData, int dataLen)
{
TXMsg_t TXMsg;
TXMsg.DestAddr = Addr;
TXMsg.PayloadLength = TXLength;
memset(TXMsg.Payload, 0, sizeof(TXMsg.Payload)); // zero out the array to start
memcpy(TXMsg.Payload, TXData, dataLen); // copy the bytes from the source array
SendMsg(&TXMsg);
}
编辑:
如果您不想复制数据,则需要重新定义结构,以便Payload
是指针而不是固定数组。所以你会改变这个:
uint8_t Payload[512];
对此:
uint8_t *Payload;
然后您可以按原样使用其余代码(您的结构已经包含一个长度字段,因此您不需要像我原先想的那样传入额外的数据)。