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