本帖最后由 ohy3686 于 2019-7-18 19:56 编辑
2017年物联网全国技能大赛中职国赛Zigbee点对点通信题目解析
1、缘起
昨天有位成都的学生网友跟我交流了一道2017年全国职业技能大赛中职组“物联网技术应用与维护”的任务五题目1,关于Zigbee点对点通信的。仔细看了一下,并不是那么的容易,所以在这里分享一下实现过程。如果有正在备赛的中职朋友,可以参考一下。
2、题目
3、编码实现
在比赛中提供了一个基于BasicRF的工程代码,只要在里面补充部分代码就可以了。在工程代码中,有一个“re_set.c”的文件,这个是主节点的代码,另外一个“slave_node.c”的文件,是从节点的代码。
主节点代码文件"“re_set.c"的实现:
void main()
{
Init();
RFInit();
while(1)
{
if(key1==0)
{
DelayMS(10);
if(key1==0)
{
while(key1==0);
P1=0x00;
mode[0]++;
switch(mode[0])
{
case 0x30: break;
P1=0x00;
//补码1001 1100的原码为:1110 0100
case 0x31:
LED4 = 1;
LED3 = 1;
LED6 = 1;
LED5 = 0;
break;
//补码1010 0110的原码为:1101 1010
case 0x32:
LED4 = 1;
LED3 = 1;
LED6 = 0;
LED5 = 1;
break;
//补码1011 0000的原码为:1101 0000
case 0x33:
LED4 = 1;
LED3 = 1;
LED6 = 0;
LED5 = 1;
break;
}
basicRfSendPacket(0x0002, mode, 1);
if(mode[0]>=0x34)
{
mode[0]=0x30;
}
}
}
}
}
//↑↑↑↑↑↑↑请在选手此区域内补充代码↑↑↑↑↑↑↑</font>
从节点代码文件"“slave_node.c"的实现:
void main()
{
Init();
RFInit();
while(1)
{
if(basicRfPacketIsReady())
{
uint8 Rx[5]=0x00;
//basicRfReceive(Rx,5,NULL);
basicRfReceive(Rx,1,NULL);
P1=0x00;
switch(Rx[0])
{
case 0x30:
P1=0x00;
break;
//补码1001 1100的原码为:1110 0100
case 0x31:
LED4 = 0;
LED3 = 1;
LED6 = 0;
LED5 = 0;
break;
//补码1010 0110的原码为:1101 1010
case 0x32:
LED4 = 1;
LED3 = 0;
LED6 = 1;
LED5 = 0;
break;
//补码1011 0000的原码为:1101 0000
case 0x33:
LED4 = 0;
LED3 = 0;
LED6 = 0;
LED5 = 0;
break;
}
}
}
}
//↑↑↑↑↑↑↑请在选手此区域内补充代码↑↑↑↑↑↑↑</font>
4、关键点
<1> 补码与原码的换算关系
对于正数,原码 = 补码。
对于负数,原码 = 补码(除了符号位)的各个位取反,加1。
补码1001 1100的原码为:1110 0100
补码1010 0110的原码为:1101 1010
补码1011 0000的原码为:1101 0000
<2> 对题目的理解非常关键,刚看到题目的时候我也懵B了。四个LED怎么表示8个数据位呢?
主节点和从节点分别有4个LED,一共8个LED分别表示8个数据位。
1用LED亮表示,0用LED灭表示。
数据依次从高到低排列:主节点的D4 D3 D6 D5,从节点的D4 D3 D6 D5
例如:1110 0100用二进制表示,就是:
主节点的D4:亮
主节点的D3:亮
主节点的D6:亮
主节点的D5:灭
从节点的D4:灭
从节点的D3:亮
从节点的D6:灭
从节点的D5:灭
理解这个很重要,不然这个题目是做不出来的。
<3> 点对点通信的数据发送和数据接收的两个函数的应用。
//将数据mode的一个字节发送到目标地址为0x0002的板子上。
basicRfSendPacket(0x0002, mode, 1);
//将板子接收到的数据读取1个字节放到Rx数组中。
basicRfReceive(Rx,1,NULL);
4、工程代码下载
完成工程代码下载(百度云盘):https://pan.baidu.com/s/1bpxxNqf
|
分析到位,学习了!