zigbee数据帧由高层(应用层)发起,在ZigBee设备之问进行数据传输的时候,要传输的数据由应用层生成,经过逐层数据处理后发送给MAC层,形成MAC层服务数据单元(MSDU)。通过添加MAC层帧头信息和帧尾,便形成了完整的MAC数据帧MPDU,其帧结构如附件内所示。
据载荷传输到MAC子层就称之为MSDU,在MSDU的前面加上MHR,后面加上MFR就构成了MAC数据帧,也就是MPDU。其中MFR包含帧控制域、序列号和寻址信息域。MFR由16bitFCS构成。MPDU传输到物理层后就作为物理层数据静载荷,也就是PSDU。PSDU的前面加上SHR和PHR就形成了PPDU,其中SHR包含前导序列和SFD域;PHR由PSDU的长度值(字节表示)组成。
MAC_McpsDataAlloc获得的一段ram,里面包含了tx buffer打包到MPDU中,其中一个固定的offset(24字节)后指向MSDU。
MAC_McpsDataAlloc分配帧缓冲区时,会分配出整个PSDU需要的空间,而msdu.p是指向PSDU中MAC payload对应的offset。但是MAC_CbackEvent返回 MAC_MCPS_DATA_CNF时,msdu.p指向出错,误指向了帧头。
通过加入以下代码可以修正
if ( event == MAC_MCPS_DATA_CNF )
{
uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p);
pData->dataCnf.pDataReq->msdu.p = originalMsdup;
}
据载荷传输到MAC子层就称之为MSDU,在MSDU的前面加上MHR,后面加上MFR就构成了MAC数据帧,也就是MPDU。其中MFR包含帧控制域、序列号和寻址信息域。MFR由16bitFCS构成。MPDU传输到物理层后就作为物理层数据静载荷,也就是PSDU。PSDU的前面加上SHR和PHR就形成了PPDU,其中SHR包含前导序列和SFD域;PHR由PSDU的长度值(字节表示)组成。
MAC_McpsDataAlloc获得的一段ram,里面包含了tx buffer打包到MPDU中,其中一个固定的offset(24字节)后指向MSDU。
MAC_McpsDataAlloc分配帧缓冲区时,会分配出整个PSDU需要的空间,而msdu.p是指向PSDU中MAC payload对应的offset。但是MAC_CbackEvent返回 MAC_MCPS_DATA_CNF时,msdu.p指向出错,误指向了帧头。
通过加入以下代码可以修正
if ( event == MAC_MCPS_DATA_CNF )
{
uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p);
pData->dataCnf.pDataReq->msdu.p = originalMsdup;
}