如何将字符值从结构写入串口并转换为整数值?

时间:2013-05-21 09:33:25

标签: c arrays serialization struct char

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 个答案:

答案 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,