2017-08-09 83 views
0

我是一个初学者,我想用一个指针向4个成员键入BIN提供一个结构表,然后将它们发送到另一个,serial2。我没有这样做。Arduino - 如何从serial.read()提供结构?

我从serial1.read()收到4个字符,例如'A''10''5''3'。 为了减小数据的大小,我想用一个结构:

struct structTable { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
}; 

我声明并设置:实例和指针

struct structTable structTable; 
struct structTable *PtrstructTable; 
PtrstructTable = &structTable; 

然后我试着喂这样的:

for(int i = 0; i<=4; i++) { 
    if(i == 1) { 
    (*PtrProgs).page = Serial.read(); 
    if(i == 2) { 
    (*PtrProgs).cric = Serial.read(); 

依此类推。但它不工作...

我试着喂第一个字符表,并试图把结果:

(*PtrProgs).page = PtrT[1], BIN; 

而现在,我知道我不能在同一时间喂3位!卫生署!所有这些看起来都非常薄弱,对于4个值而言,这当然是一个太长的过程。 (我想保留这种结构表更多的实例)。

请问,你能帮我找到一个简单的方法来喂我的表吗?

+1

Pleasse显示一致的一段代码。即请尽可能靠近[mcve]。 – Yunnosch

+0

非常抱歉,我会做 – patatos

+0

我做到了。谢谢。 – patatos

回答

0

您只能通过串行端口发送完整字节。但是你也可以直接发送原始数据。

void send (const structTable* table) 
{ 
    Serial.write((const char*)table, sizeof(structTable)); // 2 bytes. 
} 

bool receive(structTable* table) 
{ 
    return (Serial.readBytes((char*)table, sizeof(structTable)) == sizeof(structTable)); 
} 

你还必须知道的sizeof(int)的是并非适合所有CPU

字节排列顺序一个字相同。为你的结构在串行链路的另一端程序中的定义,如果具有不同字节一个CPU上运行将成为:

struct structTable { 
    unsigned short int croc:2; // 3 choices (2 bits) 
    unsigned short int crac:3; // 5 choices (3 bits) 
    unsigned short int cric:4; // 10 choices (4 bits) 
    unsigned short int page:1; // (0,1) 
}; 

注意使用短整型的,你还可以在使用arduino代码更精确。原因是short int在大多数CPU上是16位,而int可能是16,32甚至64位。

+0

谢谢Michael Roy。我会尝试这个问题,然后问这个帖子后面的新问题。 – patatos

+0

只要确保在另一端的程序中使用相同的打包结构来发送/接收数据。这种发送/接收数据的方式非常普遍,例如IP栈使用的技术是相同的。 –

1

根据Arduino参考资料,我只是查找Serial::read,代码逐字节地返回数据(一次8位)。所以可能你应该只读取一个字节的数据(一次8位),并在事后进行解包。

实际上,您可能希望使用union(有关如何使用union的信息,请参见this other stackoverflow post),以便您可以充分利用这两种方式。具体而言,如果您定义union的定义,并将位拆分,并将union的第二部分定义为一个或两个字节,则可以将数据作为字节发送,然后将其解码为您感兴趣的位。

UPDATE

这里是一些更多细节的尝试。关于工会有很多警告 - 它们不可移植,它们依赖于编译器等等,但这可能值得尝试。

typedef struct { 
    unsigned int page:1; // (0,1) 
    unsigned int cric:4; // 10 choices (4 bits) 
    unsigned int crac:3; // 5 choices (3 bits) 
    unsigned int croc:2; // 3 choices (2 bits) 
} structTable; 

typedef union { 
    structTable a; 
    uint16_t b; 
} u_structTable; 

serial.Read(val1); 
serial.Read(val2); 

u_structTable x; 
x.b = val1 | (val2<<8); 
printf("page is %d\n", x.a.page); 
+0

我实际上是从串口逐字节地读数据。但是,我想发送这4个字节到下一个序列(没有选择序列),并在表格中保留一些信息(可能是10)... sketch跟在 – patatos

+0

之后,所以既然你有10个位,写它作为两个字节与联合并读取它的方式。 –

+0

谢谢你的回答。然而,我想保持成员的最小可能的大小,这就是为什么我试图坚持一点点。 – patatos