2013-05-21 10 views
0
struct MemoryTag1; 

typedef struct MemoryTag1{ 
    char a[8]= {'+','0','2','6','.','5','EA','\r'}; // setpoint temperature value 
    char b[8]= {'-','0','2','4','.','5','EB','\r'}; 
    char c[6]= {'+','0','2','0','EC','\r'}; 
    }Memory1; 

//這是一個消息結構,我想通過串行接口(RS232)傳輸並稍後轉換爲整數值。請在這裏指導我。如何將結構中的字符值寫入串行接口並轉換爲整數值?

回答

0

你不能以這種方式使用C聲明結構:

應該

typedef struct MemoryTag1{ 
    char a[9]; 
    char b[9]; 
    char c[7]; 
    }Memory1; 

你可以在這個結構中的一個對象的聲明設定值:

Memory1 test = { 
    {'+','0','2','6','.','5','E','A','\r'}, 
    {'-','0','2','4','.','5','E','B','\r'}, 
    {'+','0','2','0','E','C','\r'} 
}; 

如果您在每個啓動對象時使用此塊,則可以使用宏來簡化對象:

#define INIT_MEMORYTAG1 {\ 
    {'+','0','2','6','.','5','E','A','\r'},\ 
    {'-','0','2','4','.','5','E','B','\r'},\ 
    {'+','0','2','0','EC','\r'}\ 
} 

,然後在一個Memory1對象的聲明:

Memory1 test = INIT_MEMORYTAG1; 

BTW:你不能把'EA''EB''EC'像1個charachter你必須把它們分開來: 'E','A''E','B''E','C',所以你必須在結構定義中更新你的char數組大小

+0

@PaulR謝謝。固定 – MOHAMED

+0

您還需要修復'EA','EB','EC'字符並增加陣列大小。 –

+0

我沒有這樣評論。他應該將這些字符分隔成不同的字符 – MOHAMED

0

這實際上不是C語法。

你不能在類型聲明中有初始化符,它沒有任何意義。

你需要像這樣做,打造訊息:

typedef struct { 
    char a[10]; 
    char b[10]; 
    char c[8]; 
} Memory1; 

int main(void) 
{ 
    Memory1 m1; 

    strcpy(m1.a, "+026.5EA\r"); 
    strcpy(m1.b, "-024.5EB\r"); 
    strcpy(m1.c, "+020EC\r"); 
    return 0; 
} 

注意的是,以上在消息的字段建立適當的C字符串,即會有充當終止0字符。尺寸太小,所以我改變了。

如果您需要通過某些不允許使用的格式發送這些字符,忽略終止符字符是微不足道的;分別發送每個字段。例如,可以使用sscanf()來完成將其中一個字段轉換回整數。

+1

你不能使用strcpy和string。由OP定義的數據在末尾不包含空字符 – MOHAMED

+0

如何將此消息結構解釋爲+026.5作爲溫度值,EA作爲設備A? – user1647229

+0

@PaulR不錯,我以爲我已經做到了。修正了,謝謝。 – unwind

0

你的語法有點過 - 試試這個:

// declare Memory1 struct type to hold data 

typedef struct MemoryTag1 { 
    char a[9]; // setpoint temperature value 
    char b[9]; 
    char c[7]; 
} Memory1; 

// allocate and initialise a Memory1 struct 

Memory1 m = { {'+','0','2','6','.','5','E','A','\r'}, 
       {'-','0','2','4','.','5','E','B','\r'}, 
       {'+','0','2','0','E','C','\r'} }; 
0

真的,說實話,我寧願更多的信息。但這並不重要。它隻影響輸出的方法。如果你在一個Arduino運行此,比如,你可以輸出到串行端口一樣容易:

Serial.begin(9600); 
Serial.write('a'); 

等,等

正如其他人所提到的,在有些情況下,你會使用以null結尾的字符串更好。但是,如果你有特別的理由這樣做,那麼我想你可能;

#include <stdio.h> 

typedef struct memoryTag1_t 
{ 
    char a[9]; // setpoint temperature value 
    char b[9]; 
    char c[7]; 
} *pMemoryTag1_t; 

typedef struct memoryTag2_t 
{ 
    char a[10]; // setpoint temperature value 
    char b[10]; 
    char c[8]; 
} *pMemoryTag2_t; 


void displayField1(char *field, int len) 
{ 
    for (int i=0; i<len; i++) 
    { 
     if (i!=0) printf(","); 
     printf("%c", field[i]); 
    }printf("\n"); 
} 

void displayField2(char *field) 
{ 
    bool firstDone = false; 
    while (*field) 
    { 
     if (firstDone) 
      printf(","); 
     else 
      firstDone = true; 
     printf("%c", *field++); 
    } 
    printf("\n"); 
} 

int main() 
{ 
    memoryTag1_t myMem1 = 
     { 
      {'+','0','2','6','.','5','E','A','\r'}, 
      {'-','0','2','4','.','5','E','B','\r'}, 
      {'+','0','2','0','E','C','\r'} 
     }; 

    memoryTag2_t myMem2 = 
     { 
      "+026.5EA\r", 
      "-024.5EB\r", 
      "+020EC\r" 
     }; 

    displayField1(myMem1.a, sizeof(myMem1.a)); 
    displayField1(myMem1.b, sizeof(myMem1.b)); 
    displayField1(myMem1.c, sizeof(myMem1.c)); 

    displayField2(myMem2.a); 
    displayField2(myMem2.b); 
    displayField2(myMem2.c); 
} 

輸出: (別忘了還有在每行的最後一個逗號 '後' 印刷\ r)的

+,0,2,6,.,5,E,A, 
-,0,2,4,.,5,E,B, 
+,0,2,0,E,C, 
+,0,2,6,.,5,E,A, 
-,0,2,4,.,5,E,B, 
+,0,2,0,E,C, 
+0

您指定此選項並且不在任何地方使用:* pMemoryTag2_t;它有什麼用處? – user1647229

+0

確實。我沒有注意到,這已成爲習慣。基本上,pMemoryTag2_t是一個指向memoryTag_2的指針。通過使它成爲類型名稱的指針部分,它可以消除混淆。 Windows API通常會這樣做。 I.e char和pchar。 CHAR和PCHAR - 一個字符和一個字符指針。它還使得在傳遞指針作爲參考時更容易(查看並快速理解)。 – enhzflep

+0

如果我想通過串行接口發送數據,那麼serial.write(a);串行寫入(b);串行寫入(c); – user1647229

相關問題