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)传输,然后转换为整数值。请指导我。

4

4 回答 4

0

真的,说实话,我更喜欢更多的信息。但这并不重要。它只影响输出的方法。例如,如果您在 arduino 上运行它,您可以像这样轻松地输出到串行端口:

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

等等等等

正如其他人所提到的,在某些情况下,您最好使用以空字符结尾的字符串。但是,如果您有特定的理由这样做,那么我想您可以

#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,
于 2013-05-21T10:22:45.000 回答
0

您不能以这种方式在 C 中声明 struct:

它应该是

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'}
};

如果您在每次启动Memory1对象时都使用此块,则可以使用宏使其更容易:

#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;

顺便说一句:你不能把'EA', 'EB','EC'像一个 1 charachter 你必须将它们分隔为: 'E','A', 'E','B','E','C'所以你必须在结构定义中更新你的 char 数组大小

于 2013-05-21T09:36:33.327 回答
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()例如,可以使用 将其中一个字段转换回整数。

于 2013-05-21T09:37:53.787 回答
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'} };
于 2013-05-21T09:38:25.280 回答