程序的设计基于SimpleMac协议栈进行,根据官方提供的MAC协议栈慎激闹示例代码进行的裁剪更改,
**************************************************************************
功能描述:向参数中传入的地址发送类型负载类型为PT_LED的数据包
输入参数:vddMillivolts为发送的16位数据,dstShortAddr为目的地址,sendDirectly为调用不同发送函数的表示符。
输出参数:无
*************************************************************************/
voidsendVddDataPacket2(u16 vddMillivolts, u16 dstShortAddr, boolean sendDirectly)
{
u8 packet[128]
//对数据包进行包装
packet[0] = (15+2)//长度
packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型
packet[2] = FCF_SHORTDST + FCF_SHORTSRC//地址类型
currSeqNum++//数据包序列号
packet[3] = currSeqNum
packet[4] =(ST_RadioGetPanId()>>0)&0xFF//目标PAN ID
packet[5] =(ST_RadioGetPanId()>>8)&0xFF
packet[6] =(dstShortAddr>>0)&0xFF//目标Node ID
packet[7] =(dstShortAddr>>8)&0xFF
packet[8] =(ST_RadioGetNodeId()>>0)&0xFF//源PAN ID
packet[9] =(ST_RadioGetNodeId()>>8)&0xFF
packet[10] = PT_LED//数据包类型
packet[11] =(vddMillivolts>>0)&0xFF//发送的16位数据
packet[12] = (vddMillivolts>>8)&0xFF
//归零Tx SFD有效负载,MSB用于指示SFD有效
packet[13] = 0
packet[14] = 0
packet[15] = 0
enqueueTxPacket(sendDirectly,dstShortAddr, packet, 13)//调用发送函数
//发送完成后令LED_D3先灭后亮闪烁一次,之后串口输出“send already!”
#ifdefPLANET_ROLE
halSetLed(LED_D3)
halCommonDelayMilliseconds(500)//500ms
halClearLed(LED_D3)
#endif
printf("send already!\r\n")
}
接收数据
/**************************************************************************
功能描述:对接收的数据铅伍包进行解析解码处理,并根据不同类型的数据包执行不同的 *** 作,数宽罩据包信息通过数据包回调函数保存在结构体变量rxData中
输入参数:无
输出参数:无
***************************************************************************/
voidprocessRxPacket(void)
{
…...
//不同的数据包类型,不同的处理
switch(packetType) {
case (GENERIC_DATA_PACKET): //普通类型数据包
RX_DETAILS(printf("GENERIC_DATA_PACKET\r\n"))
#ifdefSUN_ROLE
case (LED_PACKET): //PT_LED数据包
printf("Message from myPLANET\r\n")
halSetLed(LED_D1)//点亮LED
halCommonDelayMilliseconds(500)//延时500ms
halClearLed(LED_D1)
break
#endif
case (SUN_SEARCH_PACKET): //处理搜索父节点的数据包
RX_DETAILS(printf("SUN_SEARCH_PACKET\r\n"))
for(i=0i<PLANET_TABLE_SIZEi++) //扫描子节点数组
{
if(!planetTable[i].active) //判断是否有有效空间
{
packet[0] = (24+2)//数据包长度
packet[1] = FCF_DATA//帧类型
packet[2] = FCF_LONGDST +FCF_LONGSRC//地址类型
currSeqNum++//数据包序列号
packet[3]=currSeqNum
packet[4] =(0xFFFF>>0)&0xFF//16位短目标地址
packet[5] =(0xFFFF>>8)&0xFF
memcpy((packet+6), longSrcAddr, 8)//64位长目标地址
packet[14] =(ST_RadioGetPanId()>>0)&0xFF//16位源PAN ID
packet[15] =(ST_RadioGetPanId()>>8)&0xFF
memcpy((packet+16), ST_RadioGetEui64(),8)//64位长源地址
packet[24] = PT_SUN_AVAILABLE//负载类型
enqueueTxPacket(TRUE, 0xFFFF, packet,0)//广播
break
}
}
break
case (SUN_AVAILABLE_PACKET): //SUN节点发送的父节点可用数据包
RX_DETAILS(printf("SUN_AVAILABLE_PACKET\r\n"))
if(availableSunFound) //如果已加入网络,则停止父节点搜索
{
return
}
if(srcPanId!=MyPANID) //如果PANID不同,则不处理此数据包
{
goto stopProcessing
}
availableSunFound=TRUE
ST_RadioSetPanId(srcPanId)//设置节点PANID
packet[0] = (22+2)//数据包长度
packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型
packet[2] = FCF_LONGDST + FCF_LONGSRC//地址类型
currSeqNum++ //数据包序列号
packet[3]=currSeqNum
packet[4] =(ST_RadioGetPanId()>>0)&0xFF//16位短目标地址
packet[5] =(ST_RadioGetPanId()>>8)&0xFF
memcpy((packet+6), longSrcAddr, 8)//64位长目标地址
memcpy((packet+14), ST_RadioGetEui64(),8)//64位长源地址
packet[22] = PT_JOIN_REQUEST//负载类型
enqueueTxPacket(TRUE, 0xFFFF, packet, 0)//单播发送请求加入网络数据包
break
case (JOIN_REQUEST_PACKET): //SUN节点收到请求加网的包
RX_DETAILS(printf("JOIN_REQUEST_PACKET\r\n")) //串口终端显示
{
u8 flag=0
u8 pt= PT_JOIN_DENIED//负载类型
u8 assignedShortId[2] = {0xFE, 0xFF}
packet[0] = (24+2)//数据包长度
packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型
packet[2] = FCF_LONGDST + FCF_LONGSRC//地址类型
currSeqNum++ //数据包序列号
packet[3]=currSeqNum
packet[4] =(ST_RadioGetPanId()>>0)&0xFF//16位短目标地址
packet[5] =(ST_RadioGetPanId()>>8)&0xFF
memcpy((packet+6), longSrcAddr, 8)//64位长目标地址
memcpy((packet+14), ST_RadioGetEui64(),8)//64位长源地址
/*搜寻表中是否存在与加网节点相同的64位长地址,如果有则覆盖,若没有则继续遍历表*/
for(i=0i<PLANET_TABLE_SIZEi++)
{
u8 k=0
while(k<8)
{
if(planetTable[i].longAddr[k]!=rxData.packet[14+k])
break
k++
}
if(k==8)
{
planetTable[i].active = TRUE
shortAddrCounter++
planetTable[i].shortAddr =shortAddrCounter
pt = PT_JOIN_ACCEPTED//允许加入网络负载类型
assignedShortId[0] =(shortAddrCounter>>0)&0xFF
assignedShortId[1] =(shortAddrCounter>>8)&0xFF
printf("Join: Planet 0x%04X(index %d) has joined the network\r\n",
shortAddrCounter, i)
flag=1
break
}
}
if(flag==0) //如果没有找到相同长地址,则查找空缺位置加进去
{
for(i=0i<PLANET_TABLE_SIZEi++)
if(!planetTable[i].active) {
planetTable[i].active = TRUE
shortAddrCounter++
planetTable[i].shortAddr =shortAddrCounter
memcpy(planetTable[i].longAddr, longSrcAddr,8)
pt = PT_JOIN_ACCEPTED //允许加入网络负载类型
assignedShortId[0] =(shortAddrCounter>>0)&0xFF
assignedShortId[1] =(shortAddrCounter>>8)&0xFF
printf("Join: Planet 0x%04X(index %d) has joined the network\r\n",
shortAddrCounter, i)
break
}
}
packet[22] = pt//负载类型
packet[23] = assignedShortId[0]
packet[24] = assignedShortId[1]
enqueueTxPacket(TRUE, 0xFFFF, packet,0)//单播回应
}
break
case (JOIN_ACCEPTED_PACKET): //PLANET节点处理加入网络允许数据包
RX_DETAILS(printf("JOIN_ACCEPTED_PACKET\r\n"))
ST_RadioSetNodeId((rxData.packet[payloadStart+1]<<0)|
(rxData.packet[payloadStart+2]<<8))//设置NodeID
networkJoinedStopSearching = TRUE//加入网络成功,停止搜索
break
case (JOIN_DENIED_PACKET): //PLANET节点处理加入网络拒绝数据包
RX_DETAILS(printf("JOIN_DENIED_PACKET\r\n"))
ST_RadioSetPanId(0xFFFF)//重设PANID
break
……
……
default:
RX_DETAILS(printf("Unknown payloadtype\r\n"))
goto stopProcessing
}
stopProcessing:
rxData.packetBeingProcessed = FALSE
}
具体的调试过程中,进行灵活堂握。
如果是我的话,首先进行串口自回环测试,排除硬件串口引脚隐患。然后观察c8t6串口的引脚,注意,是c8t6串口接收引脚,手春有无波形。
c8t6板子接上调试器,在线调试看看能不埋孙能进串口中毕液耐断。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)