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 :(得分: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个字符串一样将它们分开:
'E','A'
,'E','B'
,'E','C'
,因此您必须在结构定义中更新char数组大小
答案 1 :(得分: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()
将其中一个字段转换回整数。
答案 2 :(得分: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'} };
答案 3 :(得分: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 \ n)
+,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,