伯乐 发表于 2016-10-11 11:42:03

arduino底板开发,数据点定义问题

请教下各位关于arduino底板数据点定义,,我定义了三个数据点:LED_r,LED_g,LED_b,布尔值,三个按钮。

以下是代码定义:


以下是调试输出数据:每个按钮操作两次,开、关。

可以看第一个按钮值正常,LED_r,灯正常运行,,第二个,第三个就不正常了。。这是怎么回事呢?数据点没定义好么。
贴上份代码:


伯乐 发表于 2016-10-12 10:47:08

没人懂??:L

true 发表于 2016-10-13 11:58:34

楼主你数据点没有理解对,云端定的bool型数据点,代码里按数值型数据点解析了,请结合对应的通信协议文档进行修改,也可参考官网示例工程中的bool型数据点的用法。

伯乐 发表于 2016-10-13 23:30:31

true 发表于 2016-10-13 11:58
楼主你数据点没有理解对,云端定的bool型数据点,代码里按数值型数据点解析了,请结合对应的通信协议文档进 ...

你好,哥们 对的,一直对这里不理解,不怎么这么设置,你帮忙看看这里。


晕船海盗 发表于 2016-10-14 06:18:51

本帖最后由 晕船海盗 于 2016-10-14 06:21 编辑

伯乐 发表于 2016-10-13 23:30
你好,哥们 对的,一直对这里不理解,不怎么这么设置,你帮忙看看这里。



arduino程序 结构体中对数据定义错误   
typedef struct
{
uint8_tAttr_Flags;
uint8_tLED;    #此处定义的LED是一个byte前三位 为 LED_rLED_gLED_b
}

后面的程序 对LED变量进行移位判断

你这个程序最直接改法就是 后面的 LED_g,LED_b也改成 LED_r

true 发表于 2016-10-17 11:01:36

“字节序(及byte序)”表示按字节为单位从高往低依次排列
“bit序(及位序)”表示按位从低往高位依次排列

这部分可以看论坛中的教学资料,要结合串口输出的协议内容来理解。

结构体的定义楼上说的对,但建议改成如下:

typedef struct
{
uint8_tLED_R; #此处定 bool型R灯的有效位判断
uint8_tLED_G;#此处定 bool型G灯的有效位判断
uint8_tLED_B;#此处定 bool型B灯的有效位判断
}ReadTypeDef_t;

typedef struct
{
uint8_tAttr_Flags;
uint8_tLED;    #此处定义的LED是一个byte前三位 为 LED_rLED_gLED_b
}WirteTypeDef_t;

伯乐 发表于 2016-10-18 23:19:49

晕船海盗 发表于 2016-10-14 06:18
arduino程序 结构体中对数据定义错误   
typedef struct
{


谢谢,哥们解答,现在判断哪里又有点小问题。。

伯乐 发表于 2016-10-18 23:24:33

本帖最后由 伯乐 于 2016-10-18 23:26 编辑

true 发表于 2016-10-17 11:01
“字节序(及byte序)”表示按字节为单位从高往低依次排列
“bit序(及位序)”表示按位从低往高位依次排列 ...
你好,谢谢解答。按你的写法呢,下面的判断如何写啊,我写的你看看,还是不行。。。标志位 数据点 结构体,一直没理清思路。麻烦帮忙看看,以后好整理点教程出来。谢谢!
/******************
typedef enum
{
SetLED_OnOff    = 0x01,
SetLED_Color    = 0x02,
SetLED_R      = 0x04,
SetLED_G      = 0x08,
SetLED_B      = 0x10,
SetMotor      = 0x20,

} Attr_FlagsTypeDef;
******************/
typedef enum
{
LED_OnOff       = 0x00,
LED_OnOn      = 0x01,

} LED_TypeDef;

typedef struct
{
uint8_t             LED_r;
uint8_t             LED_g;
uint8_t             LED_b;
} ReadTypeDef_t;

typedef struct
{
uint8_t             Attr_Flags;
uint8_t             LED;
} WirteTypeDef_t;

WirteTypeDef_tWirteTypeDef;
ReadTypeDef_t ReadTypeDef;
void GizWits_GatherSensorData(void);
void GizWits_ControlDeviceHandle(void);判断语句:
void GizWits_ControlDeviceHandle(void)
{
if ( (WirteTypeDef.Attr_Flags & (1 << 0)) == (1 << 0))
{
    if (WirteTypeDef.LED == LED_OnOn)
      {
      ReadTypeDef.LED_r = LED_r;
      LED_RGB_Control(254, 0, 0);
      Serial.print(WirteTypeDef.LED);
      Serial.println("LED");
      }else{
      ReadTypeDef.LED_r = false;
      LED_RGB_Control(0, 0, 0);
      }
}
if ( (WirteTypeDef.Attr_Flags & (1 << 1)) == (1 << 1))
{
   if (WirteTypeDef.LED == LED_OnOn)
      {
      ReadTypeDef.LED_g = LED_g;
      LED_RGB_Control(0, 254, 0);
      Serial.print(WirteTypeDef.LED);
      Serial.println("LED");
      }else{
      ReadTypeDef.LED_g = false;
      LED_RGB_Control(0, 0, 0);
      }
}
if ( (WirteTypeDef.Attr_Flags & (1 << 2)) == (1 << 2))
   {
      if (WirteTypeDef.LED == 0x01)
      {
      ReadTypeDef.LED_b = LED_b;
      LED_RGB_Control(0, 0, 254);
      }else{
      ReadTypeDef.LED_b = false;
      LED_RGB_Control(0, 0, 0);
      }
   }
}


晕船海盗 发表于 2016-10-19 05:57:23

本帖最后由 晕船海盗 于 2016-10-19 05:58 编辑

伯乐 发表于 2016-10-18 23:24
你好,谢谢解答。按你的写法呢,下面的判断如何写啊,我写的你看看,还是不行。。。标志位 数据点 结构体 ...
/********
typedef enum
{
SetLED_OnOff    = 0x01,
SetLED_Color    = 0x02,
SetLED_R      = 0x04,
SetLED_G      = 0x08,
SetLED_B      = 0x10,
SetMotor      = 0x20,

} Attr_FlagsTypeDef;
********/
typedef enum
{
LED_OnOff       = 0x00,
LED_OnOn      = 0x01,

} LED_TypeDef;

typedef struct
{
uint8_t             LED;

} ReadTypeDef_t;

typedef struct
{
uint8_t             Attr_Flags;
uint8_t             LED;
} WirteTypeDef_t;

WirteTypeDef_tWirteTypeDef;
ReadTypeDef_t ReadTypeDef;
void GizWits_GatherSensorData(void);
void GizWits_ControlDeviceHandle(void);





void GizWits_ControlDeviceHandle(void)
{
if ( (WirteTypeDef.Attr_Flags & (1 << 0)) == (1 << 0))
{
   if (WirteTypeDef.LED & (1 << 0) == (1 << 0))
    {
      ReadTypeDef.LED |= (1 << 0);
      LED_RGB_Control(254, 0, 0);
      Serial.print(WirteTypeDef.LED);
      Serial.println("LED");
    } else {
      ReadTypeDef.LED &= ~(1 << 0);
      LED_RGB_Control(0, 0, 0);
    }
}
if ( (WirteTypeDef.Attr_Flags & (1 << 1)) == (1 << 1))
{
if (WirteTypeDef.LED & (1 << 1) == (1 << 1))
    {
      ReadTypeDef.LED |= (1 << 1);
    LED_RGB_Control(0, 254, 0);
      Serial.print(WirteTypeDef.LED);
      Serial.println("LED");
    } else {
      ReadTypeDef.LED &= ~(1 << 1);
      LED_RGB_Control(0, 0, 0);
    }
}
if ( (WirteTypeDef.Attr_Flags & (1 << 2)) == (1 << 2))
{
    if (WirteTypeDef.LED & (1 << 2) == (1 << 2))
    {
      ReadTypeDef.LED |= (1 << 2);
      LED_RGB_Control(0, 0, 254);
    } else {
    ReadTypeDef.LED &= ~(1 << 2);
      LED_RGB_Control(0, 0, 0);
    }
}
}

晕船海盗 发表于 2016-10-19 06:02:43

伯乐 发表于 2016-10-13 23:30
你好,哥们 对的,一直对这里不理解,不怎么这么设置,你帮忙看看这里。




这个地方你直接把LED_r ,LED_g, LED_b定义成 bool格式,下面就无法对LED调亮度了,只能控制亮和灭。

伯乐 发表于 2016-10-19 21:18:22

晕船海盗 发表于 2016-10-19 05:57
/********
typedef enum
{


上板测试了下,不行呢,还是只能控制红灯开关。绿灯、蓝灯不行。现在在研究数据点问题,搞不懂在arduino IDE 怎么回事。。
页: [1]
查看完整版本: arduino底板开发,数据点定义问题