使用memcpy或strcpy时,我在Atmel Studio中遇到问题。当开关评估为TYPE3时,仅复制前10个字节。当案例的顺序相互交换时,其他strcpy的工作就会完成。我真的不明白为什么这会有所作为,以及为什么简单的strcpy无法使用。任何帮助表示赞赏。
t_RdmPacket在包含文件中定义:
typedef union T_RdmPacket
{
uint8_t Slot[257]; // Maximale grootte Packet = 255 bytes, + 2 Checksum bytes
struct
{
uint8_t Preamble[8];
uint8_t ManIDMsbOr0xAA;
uint8_t ManIDMsbOr0x55;
uint8_t ManIDLsbOr0xAA;
uint8_t ManIDLsbOr0x55;
uint8_t ProdIDMsbOr0xAA;
uint8_t ProdIDMsbOr0x55;
uint8_t ProdIDLsbOr0xAA;
uint8_t ProdIDLsbOr0x55;
uint8_t SerNrMsbOr0xAA;
uint8_t SerNrMsbOr0x55;
uint8_t SerNrLsbOr0xAA;
uint8_t SerNrLsbOr0x55;
uint8_t ChecksumMsbOr0xAA;
uint8_t ChecksumMsbOr0x55;
uint8_t ChecksumLsbOr0xAA;
uint8_t ChecksumLsbOr0x55;
} DiscoveryResponse;
struct
{
uint8_t StartCodeRDM; //Slot 0
uint8_t SubStartCode; //Slot 1
uint8_t MessageLength; //Slot 2 Min 24, Max 255
struct
{
uint16_t ManID; //Slot 3 & 4 / 9 & 10
uint16_t ProdID; //Slot 5 & 6 / 11 & 12
uint16_t SerNr; //Slot 7 & 8 / 13 & 14
} Destination, Source;
uint8_t TransactionNumber; //Slot 15
uint8_t ResponseType; //Slot 16
uint8_t MessageCount; //Slot 17
uint16_t SubDevice; //Slot 18 & 19
uint8_t CommandClass; //Slot 20
uint16_t ParameterID; //Slot 21 & 22
uint8_t PDL; //Slot 23 Min 0, Max 231
uint8_t ParameterData[231]; //Slot 24 t/m 254
uint16_t Checksum; //Slot 255 & 256
} Packet;
} t_RdmPacket;
然后处理数据包:
t_RdmPacket Rdm;
void sendGetDeviceModelDescriptionResponse(uint8_t *uid) {
uint16_t checkSum;
memset(Rdm.Packet.ParameterData, 0, 231);
uint8_t size = 0;
const char* text1 = "1234567890123456";
const char* text2 = "6543210987654321";
const char* text3 = "123456789012345";
const char* responderText = "Multi RDM Responder";
const char* dummyText = "Dummy RDM Responder";
if (slaveDevice == -1)
{
strcpy((char*)Rdm.Packet.ParameterData, responderText);
size = 19;
}
else
{
switch(SlaveResponder[slaveDevice].DeviceModelID)
{
case TYPE1:
strcpy((char*)Rdm.Packet.ParameterData, text1);
size = 16;
break;
case TYPE2:
strcpy((char*)Rdm.Packet.ParameterData, text2);
size = 16;
break;
case TYPE3:
strcpy((char*)Rdm.Packet.ParameterData, text3);
size = 15;
if (Rdm.Packet.ParameterData[11]==0)
{
// I get here, I don't know why..
PORTD SET_B(3); // Debug LED On
}
break;
default:
strcpy((char*)Rdm.Packet.ParameterData, dummyText);
size = 19;
break;
}
}
createRdmHeader(uid);
Rdm.Packet.ResponseType = RESPONSE_TYPE_ACK;
Rdm.Packet.CommandClass = GET_COMMAND_RESPONSE;
Rdm.Packet.PDL = size;
Rdm.Packet.MessageLength = 24 + Rdm.Packet.PDL;
checkSum = calculateCheckSum();
Rdm.Slot[Rdm.Packet.MessageLength] = (checkSum & 0xFF00) >> 8;
Rdm.Slot[Rdm.Packet.MessageLength + 1] = checkSum & 0x00FF;
setWaitTimer();
}
我将扩大我的评论。AFAIK我知道函数strcpy()有两个参数strcpy(char * to,char * from),其中to和from是地址。您使用了确切的字符串,也许没有警告,因为您的IDE禁用了它。确保在编译时使用-Wall。
我认为您应该尝试使用某些const char * constant_value = "5432154321543215"
,而不是使用第二个参数作为字符串调用strcpy。对我来说很难说您的strcpy实现是什么。
起初,我要确保您能从编译中看到所有警告。