Arduino - 如何从serial.read()提供结构?

时间:2017-08-09 20:35:45

标签: c++ c arduino

我是初学者,我正在尝试使用指针输入一个带有4个成员键入BIN的结构表,然后将它们发送到另一个,serial2。我没有这样做。

我从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();

等等。但它不起作用......

我尝试提供第一个char表并尝试转换结果:

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

现在,我意识到我不能一次喂3位!卫生署!所有这些看起来都非常微弱,当然只有4个值的过程太长。 (我想为更多实例保留这种结构表)。

拜托,您能帮我找一个更简单的方法来喂我的桌子吗?

2 个答案:

答案 0 :(得分:1)

根据我刚刚查询的Serial::read的Arduino引用,代码逐字节地返回数据(一次8位)。所以你可能只需要读取一个字节的数据(一次8位)并在事后解压缩。

事实上,您可能希望使用union(请参阅例如this other stackoverflow post了解如何使用union),以便您可以充分利用这两个方面。具体来说,如果定义一个定义的union,其中的位被分解,而union的第二部分定义为一个或两个字节,则可以将数据作为字节发送,然后在位中对其进行解码你有兴趣。

<强>更新

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

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

答案 1 :(得分:1)

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

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)在所有CPUS上都不一样

关于字节序的一句话。如果在具有不同字节顺序的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)
};

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