2012-11-11 48 views
1

嗨有一個錯誤說:當我將代碼上傳到Arduino atmega時,在typedef聲明中缺少類型名稱。在typedef聲明中缺少類型名稱

typedef union DrsData 
{ 
unsigned char ucData[MAX_PACKET_SIZE-MIN_PACKET_SIZE]; 

DrsRWData  stRWData; 
DrsIJogData  stIJogData; 
DrsSJogData  stSJogData; <-the error is highlighted at this line 
}DrsData; 

我可以知道這段代碼有什麼問題嗎? 謝謝!

這是包含標題的源代碼。

#include<Arduino.h> 
#include<Wire.h> 
#include<Math.h> 
#include <SoftwareSerial.h>// 
#define rxPin 19 // Defines the "recieve" pin for software serial to motor `enter code here`controller 
#define txPin 18 // Defines the "transmit" pin for software serial to motor controller 

    //CPU 
    #define F_CPU 16000000 

//ATmega128? ???? ?? ???? ?? 
#include <avr/io.h> 
//interrupt? ???? ? ??? ???? ???? ?? 
#include <avr/interrupt.h> 
//_delay_ms ? ??? ??? ???? ?? 
#include <util/delay.h> 

#include<inttypes.h> 

#define PROTOCOL_SIZE_IDX 2 
#define PROTOCOL_ID_IDX 3 
#define PROTOCOL_CMD_IDX 4 
#define PROTOCOL_CS1_IDX 5 
#define PROTOCOL_CS2_IDX 6 
#define PROTOCOL_DATA_IDX 7 

#define HEADER  0xFF 

//SIZE 
#define MIN_PACKET_SIZE  7 
#define MIN_ACK_PACKET_SIZE  9 
#define MAX_PACKET_SIZE   223 
#define MAX_DATA_SIZE  (MAX_PACKET_SIZE-MIN_PACKET_SIZE) 

//ID ?? 
#define MAX_ID     0xFD  
#define BROADCAST_ID   0xFE 

//CMD - Request Packet 
#define CMD_EEP_WRITE   0x01 
#define CMD_EEP_READ   0x02 
#define CMD_RAM_WRITE   0x03 
#define CMD_RAM_READ   0x04  
    #define CMD_RW_DATA_ADDR_IDX 7 
    #define CMD_RW_DATA_LEN_IDX  8 
#define CMD_I_JOG    0x05 
    #define CMD_I_JOG_STRUCT_SIZE 5 
    #define CMD_I_JOG_MAX_DRS  (MAX_DATA_SIZE/CMD_I_JOG_STRUCT_SIZE) 
#define CMD_S_JOG     0x06 
    #define CMD_S_JOG_STRUCT_SIZE 4 
    #define CMD_S_JOG_MAX_DRS  (MAX_DATA_SIZE/CMD_S_JOG_STRUCT_SIZE) 
#define CMD_STAT     0x07  
#define CMD_ROLLBACK    0x08 
#define CMD_REBOOT     0x09 

#define CMD_MIN        (CMD_EEP_WRITE) 
#define CMD_MAX        (CMD_REBOOT) 

//CMD - ACK Packet 
#define CMD_ACK_MASK      0x40 

#define CMD_EEP_WRITE_ACK     (CMD_EEP_WRITE|CMD_ACK_MASK) 
#define CMD_EEP_READ_ACK     (CMD_EEP_READ|CMD_ACK_MASK) 
#define CMD_RAM_WRITE_ACK     (CMD_RAM_WRITE|CMD_ACK_MASK) 
#define CMD_RAM_READ_ACK     (CMD_RAM_READ|CMD_ACK_MASK) 
#define CMD_I_JOG_ACK      (CMD_I_JOG|CMD_ACK_MASK) 
#define CMD_S_JOG_ACK      (CMD_S_JOG|CMD_ACK_MASK) 
#define CMD_STAT_ACK      (CMD_STAT|CMD_ACK_MASK) 
#define CMD_ROLLBACK_ACK     (CMD_ROLLBACK|CMD_ACK_MASK) 
#define CMD_REBOOT_ACK      (CMD_REBOOT|CMD_ACK_MASK 

#define CMD_ACK_MIN       (CMD_EEP_WRITE_ACK) 
#define CMD_ACK_MAX       (CMD_REBOOT_ACK) 

#define DrsPacket 
#define stPacket 
#define pstPacket 
#define DrsData 
typedef struct DrsSet 
    { 
    unsigned char ucStopFlag : 1; 
    unsigned char ucMode : 1; 
    unsigned char ucLedGreen : 1; 
    unsigned char ucLedBlue : 1; 
    unsigned char ucLedRed : 1; 
    unsigned char ucJogInvalid : 1; 
    unsigned char reserved : 2; 
    }DrsSet; 

    typedef struct DrsJog 
    { 
    unsigned int uiValue : 15; 
    unsigned int reserved : 1; 
    }DrsJog; 

    typedef struct DrsSJog 
    { 
    DrsJog   stJog; 
    DrsSet   stSet; 
    unsigned char ucId; 
    }DrsSJog; 

    typedef struct DrsIJog 
    { 
     DrsJog   stJog; 
     DrsSet   stSet; 
    unsigned char ucId; 
    unsigned char ucPlayTime; 
    }DrsIJog; 

    typedef struct DrsIJogData 
    { 
    DrsIJog   stIJog[CMD_I_JOG_MAX_DRS]; 
    }DrsIJogData; 

    typedef struct DrsSJogData 
    { 
    unsigned char ucPlayTime; 
    DrsSJog   stSJog[CMD_S_JOG_MAX_DRS]; 
    }DrsSJogData; 

    typedef struct DrsRWData 
    { 
    unsigned char ucAddress; 
    unsigned char ucLen;   
    unsigned char ucData[MAX_DATA_SIZE-2]; 
    }DrsRWData; 

    typedef union DrsData 
    { 
    unsigned char ucData[MAX_PACKET_SIZE-MIN_PACKET_SIZE]; 

    DrsRWData  stRWData; 
    DrsIJogData  stIJogData; 
    DrsSJogData  stSJogData; 
    }DrsData; 

typedef struct DrsPacket 
    { 
    unsigned char   ucHeader[2]; 
    unsigned char   ucPacketSize; 
    unsigned char   ucChipID; 
    unsigned char   ucCmd; 
    unsigned char   ucCheckSum1; 
    unsigned char   ucCheckSum2; 
    union DrsData    unData; 
    }DrsPacket; 


//CheckSum 
#define CHKSUM_MASK       0xFE 


//////////////////////////////receiving state result value ////////////////////////////// 
    enum{ 
    DRS_RXWAITING, 
    DRS_RXCOMPLETE, 
    DRS_HEADERNOTFOUND, 
    DRS_INVALIDSIZE, 
    DRS_UNKNOWNCMD, 
    DRS_INVALIDID, 
    DRS_CHKSUMERROR, 
    DRS_RXTIMEOUT 
    }DrsRxStatus; 

//?? ??? ??? ?? 
#define USART_BUF_SIZE 256 

//?? ??, ?? ???, ?? ???, ??? ?? ??? ?? ?? 
//USART0_EXT volatile unsigned char gucRxBuffer[USART_BUF_SIZE]; 
//USART0_EXT volatile unsigned char gucRxBufferReadIdx; 
//USART0_EXT volatile unsigned char gucRxBufferWriteIdx; 
//USART0_EXT volatile unsigned char gucRxBufferCnt; 

volatile unsigned char gucRxBuffer[USART_BUF_SIZE]; 
volatile unsigned char gucRxBufferReadIdx; 
volatile unsigned char gucRxBufferWriteIdx; 
volatile unsigned char gucRxBufferCnt; 

//USART0? ??? ?? 
void USART0_Init(unsigned long ulBaudRate); 
//USART0? ?? ??? ???? ?? 
void USART0_PutChar(unsigned char ucData); 
//USART0? ?? ?? ?? ???? ?? 
void USART0_PutNChar(unsigned char *pucData, unsigned char ucCnt); 
//USART0? ?? ???? ?? ?? ???? ???? ?? 
unsigned char USART0_ucGetNChar(unsigned char *pucTarget, unsigned char ucCnt); 
//USART0? ?? ???? ?? ?? ???? ??? ?? 
unsigned char USART0_ucTrashNChar(unsigned char ucCnt); 
//USART0? ?? ??? ????? ?? 
void USART0_ClearBuffer(void); 

void hklx_Init(unsigned long ulBaudRate); 

void hklx_SendPacket(DrsPacket stPacket); 

unsigned char hklx_ucReceivePacket(DrsPacket *pstPacket); 

void setup() 
{ 
    //DRS-0101? Calibrated Position ??? ???? ?? ??? 
typedef struct DrsCaliPos 
{ 
    int  iPosition : 13; 
    unsigned int uiGPIO1 : 1; 
    unsigned int uiGPIO2 : 1; 
    unsigned int reserved : 1; 
} 

DrsCaliPos; 

//Calibrated Position ??? ?? ??? ?? ??? 
typedef union DrsUnionCaliPos 
{ 
    DrsCaliPos stCaliPos; 
    unsigned int uiCaliPos; 
} 

DrsUnionCaliPos; 

//HerkuleX? ???? ?? ??? 
    Serial.begin(9600); 
    Serial.begin(115200); 
    pinMode(rxPin, INPUT); //RX //connect to TX of motor 
    pinMode(txPin, OUTPUT); //TX //connect to RX of motor 

} 

    typedef struct DrsPacket 
    { 
    unsigned char ucHeader[2]; 
    unsigned char ucPacketSize; 
    unsigned char ucChipID; 
    unsigned char ucCmd; 
    unsigned char ucCheckSum1; 
    unsigned char ucCheckSum2; 
    DrsData  unData; 
    }DrsPacket; 

// void hklx_SendPacket(DrsPacket stPacket){ 
void hklx_SendPacket(DrsPacket stPacket){ 
    unsigned char i; 
     DrsPacket stPacket; 

    // declare header 
    stPacket.ucHeader[0] = HEADER; 
    stPacket.ucHeader[1] = HEADER; 

    //CheckSum 
    stPacket.ucCheckSum1 = stPacket.ucPacketSize^stPacket.ucChipID^stPacket.ucCmd; 
    for(i=0; i<(stPacket.ucPacketSize-MIN_PACKET_SIZE); i++)  
     stPacket.ucCheckSum1 ^= stPacket.unData.ucData[i]; 

    stPacket.ucCheckSum2 = ~(stPacket.ucCheckSum1); 
    stPacket.ucCheckSum1 &= CHKSUM_MASK;  
    stPacket.ucCheckSum2 &= CHKSUM_MASK; 

    //PacketSize ?? USART0?? ?? 
    USART0_PutNChar(&stPacket.ucHeader[0], stPacket.ucPacketSize); 

    return 0; 
} 

完整的錯誤消息:

line 136: error: missing type-name in typedef-declaration 
line 147: error: missing type-name in typedef-declaration 
line 250: error: ISO C++ forbids declaration of 'unData' with no type 
line 251: error: missing type-name in typedef-declaration 
line 259: error: expected primary-expression before '.' token 
+0

你能發佈完整的源代碼,包含的頭文件和完整的錯誤消息嗎? – Sudar

回答

0

事情是這樣的:Arduino的IDE具有its own preprocessor它的設計,使事情很適合初學者。用戶定義的類型不幸是一個讓我們其他人更難做到的地方。

鏈接的頁面建議將類型聲明放置在單獨的頭文件中。我也有與類似技術的成功:

typedef struct _xyz { 
    int a; 
    int b; 
    int c; 
} XYZ; 

void myFunc(struct _xyz *xyzName) { 
    ... 
} 

改變線上產生錯誤struct _DrsSJogData stSJogData;應該解決的錯誤(因爲你也改變DrsSJogData的聲明,我認爲),但只具有讀的Arduino的建議我'那就去吧。

將所有類型的聲明放在一個獨立於主草圖的頭文件中,你應該沒問題。