概述
zigbee协议栈初使用(四)无线串口透传
串口透传意思是通过Zigbee实现两个PC通讯,两个Zigbee模块地位应该是一样的。
在void MT_UartInit(),有代码如下:
1#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
2#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
3#else
uartConfig.callBackFunc = NULL;
4#endif
加粗部分是协议栈数据串口接收处理函数,进入函数定义。
函数根据网蜂《zigbee实战指南》进行了更改,直接删除原先的用改后的,代码如下:
/*****************网蜂修改**************************/
void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
uint8 flag = 0,i,j = 0; //flag判断有没有数据,j记录数据长度
uint8 buf[128]; //缓冲128
(void)event;
while(Hal_UART_RxBufLen(port)) //检测串口数据是否完成
{
HalUARTRead(port,&buf[j],1);//数据接收到buf
j++;
flag = 1;
}
if(flag == 1) //有数据时
{//分配内存,结构体+内容+长度
pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof
( mtOSALSerialData_t )+j+1);
pMsg->hdr.event = CMD_SERIAL_MSG;
pMsg->msg = (uint8*)(pMsg+1); //把数据定位到结构体
pMsg->msg [0]= j; //记录数据长度
for(i=0;i<j;i++)
pMsg->msg [i+1]= buf[i];
osal_msg_send( App_TaskID, (byte *)pMsg ); // 登记任务并发往上层
osal_msg_deallocate ( (uint8 *)pMsg ); // 释放内存
}
}
更改后数据串口接收处理流程为:
1、接收数据
2、判断长度然后给数据包pMsg分配内存
3、打包发给上层OSAL处理
4、释放内存
显然这里得到的数据包由 datalen + data组成;
接下来对得到的数据包放到任务中处理,显然应该是在SampleApp.c,找到任务处理函数uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )前文中提起过,
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
//串口接收数据后由MT_USART层传来数据,用网蜂方法接收,编译时不定义MT相关内容
case CMD_SERIAL_MSG:
SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
break;
中文备注下是添加部分, SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);为自定义的无线发送函数,代码如下:
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg) //网蜂提供
{
uint8 i,len,*str=NULL; //len有用数据长度
str=cmdMsg->msg; //指向数据开头
len=*str; //msg里的第1个字节代表后面的数据长度
/********打印出串口接收到的数据,用于提示*********/
for(i=1;i<=len;i++)
HalUARTWrite(0,str+i,1 );
HalUARTWrite(0,"n",1 );//换行
/*******发送出去,同无线数据传输********/
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_COM_CLUSTERID,//自己定义一个
len+1, // 数据长度
str, //数据内容
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
1#define SAMPLEAPP_COM_CLUSTERID 3 ,数据包号自己添加
接下来打印函数
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
{
uint8 len,i;
switch ( pkt->clusterId )
{
case SAMPLEAPP_COM_CLUSTERID: //数据包ID
HalUARTWrite(0, "message:", sizeof("message:")); //提示信息
len=pkt->cmd.Data[0];
for(i=0;i<len;i++)
HalUARTWrite(0,&pkt->cmd.Data[i+1],1);//发给 PC 机
HalUARTWrite(0,"n",1); // 回车换行
break;
}
}
最后还要修改预编译,注释掉 MT 层的内容。这里注意,选择了协调器、路
由器、或者终端编译时都要修改 options 的。
参考如下:
ZIGBEEPRO
NWK_AUTO_POLL(需要自动重连时加入)
ZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
分别下载到协调器(必须),终端(或路由)。
最后
以上就是正直唇膏为你收集整理的zigbee协议栈初使用(四)无线串口透传的全部内容,希望文章能够帮你解决zigbee协议栈初使用(四)无线串口透传所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复