C 如何将结构中的字符值写入串行接口并转换为整数值?

C 如何将结构中的字符值写入串行接口并转换为整数值?,c,arrays,serialization,struct,char,C,Arrays,Serialization,Struct,Char,//这是一个消息结构,我想通过串行接口(RS232)传输,然后转换成整数值。请在这方面指导我。您不能以这种方式在C中声明结构: 应该是 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'};

//这是一个消息结构,我想通过串行接口(RS232)传输,然后转换成整数值。请在这方面指导我。

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

应该是

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;
可以在此结构的对象声明中设置值:

typedef struct MemoryTag1{
    char a[9];
    char b[9];
    char c[7];
    }Memory1;
如果在每次启动
内存1
对象时都使用此块,则可以使用宏使其更容易:

Memory1 test = {
    {'+','0','2','6','.','5','E','A','\r'},
    {'-','0','2','4','.','5','E','B','\r'},
    {'+','0','2','0','E','C','\r'}
};
然后在
内存1
对象的声明中:

#define INIT_MEMORYTAG1 {\
    {'+','0','2','6','.','5','E','A','\r'},\
    {'-','0','2','4','.','5','E','B','\r'},\
    {'+','0','2','0','EC','\r'}\
}
顺便说一句:你不能把
'EA'
'EB'
'EC'
像一个1字符一样,你必须把它们分开:
'E','A'
'E','B'
'E','C'
,因此您必须更新结构定义中的字符数组大小,这实际上不是C语法

在类型声明中不能有初始值设定项,这没有任何意义

您需要这样做,以构建消息:

Memory1 test = INIT_MEMORYTAG1;
请注意,以上内容将在消息字段中构建适当的C字符串,即将有0个字符作为终止符。尺码太小了,所以我改了

如果您需要通过不允许终止符的格式发送此文件,那么忽略终止符字符是很简单的;分别发送每个字段


例如,可以使用
sscanf()
将其中一个字段转换回整数。

您的语法有点不正确-尝试以下方法:

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

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

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

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


不能使用strcpy和string。OP定义的数据在末尾不包含空字符。如何将此消息结构解释为+026.5作为温度值,EA作为设备A???@MOHAMED当然我们可以使用字符串,正如我所说,这取决于数据的传输方式。发送此文件(或写入文件或其他内容)时不需要包含
'0'
。您还需要修复
EA
EB
EC
字符,并增加数组大小。我没有注意到这一点。他应以不同的字符分隔这些字符。如何将此消息结构解释为+026.5作为温度值,EA作为设备A?您正在指定此参数,而不是在任何地方使用:*pMemoryTag2\u t;它有什么用?没错。我没注意到,这已经成了习惯。基本上,pMemoryTag2_t是一个指向memoryTag_2的指针类型。通过将指针作为类型名的一部分,可以消除混淆。Windows API通常会这样做。即char和pchar。CHAR和PCHAR-一个CHAR和一个CHAR指针。当将指针作为引用传递时,它也更容易(查看和快速理解);串行写入(b);串行写入(c);如何在接口上只发送char a[]我将在回答的第一句话中展开一点-如果不知道您使用的是哪个操作系统和/或系统,您将无法得到答案。正如我所演示的,用Arduino将它们发送到串行端口非常简单。但要回答你的问题-我不知道,从来没有必要。只要谷歌“使用COM端口windows c/c++”或linux(如果这是您的系统,或者如果硬件不是x86),然后搜索相同的东西,尽管是针对您的平台。您可能会在SourceForge、github或google代码上的“串行端口监视器”项目中找到一些代码。答案等着你……:)
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);
}
+,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,