微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > SimpleApp串口收发与无线收发

SimpleApp串口收发与无线收发

时间:10-02 整理:3721RD 点击:


本次实验,是参考多人博客论文的成果,这里不一一列举,还是多谢谢你们!
下面进入正题:
最终实现:
传感节点串口接收、无线发送 采集节点无线接收、串口发送
1、传感节点
采用了MT层的功能:
预编译加入:ZAPP_P1 和 MT_TASK
直接切入主要流程:
osalInitTasks()

……

#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
……


看MT层初始化,知道其最终是通过函数:void SPIMgr_Init ();进行串口配置工作的,
根据编译选项:ZAPP_P1 ,得知,定义了串口回调函数为:uartConfig.callBackFunc = SPIMgr_ProcessZAppData;
在下面的程序中,有下面这段程序,注意这里有颜色的部分的数值修改为80

#if defined (ZAPP_P1) || defined (ZAPP_P2)
/* Default max bytes that ZAPP can take */
SPIMgr_MaxZAppBufLen = 80;
SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;
#endif

这样就完成了串口的配置,这个对 协调器和终端节点都是有效的;

下面看看,传感节点串口(UART)接收到数据后,是如何处理的:
当然会首先调用上面定义的串口回调函数:SPIMgr_ProcessZAppData
void SPIMgr_ProcessZAppData ( uint8 port, uint8 event ) ; 这个函数设置了一个事件,就是 SPI_INCOMING_ZAPP_DATA 事件,并将这个事件发送给应用层的系统事件中。
其中,App_TaskID 必须在应用层初始化的时候进行注册,通过

void SPIMgr_RegisterTaskID( byte taskID )
{
App_TaskID = taskID;
}
可以完成注册,这样就完成了偷天换日的工作了(貌似这也是从哪位前辈的博客中看到的词,借用一下哈)
其次,对于 SPI_INCOMING_ZAPP_DATA 事件,应用层并没有设置与它相关的事件处理函数,那么我们就需要在应用层中进行添加,
在sapi.c文件中,
void SAPI_Init( byte task_id )
{
……
SPIMgr_RegisterTaskID( task_id ); // 这里先把上面说的注册任务的工作添加进去
……
}
接着,
在 UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events ); 中添加任务事件

if ( events & SYS_EVENT_MSG ) //系统消息事件
{
// 强制类型转换,将接受消息的事件头部赋给 pMsg :event、status
pMsg = (osal_event_hdr_t *) osal_msg_receive( task_id );
while ( pMsg ) // 存在系统消息
{
switch ( pMsg->event )
{
……
// 这里添加了这个事件以及该事件的处理函数:

case SPI_INCOMING_ZAPP_DATA:
pMSGpkt = (afIncomingMSGPacket_t *) pMsg;
SAPI_UartSendData( pMSGpkt );
break;
……
………………………………
下面定义对这个事件处理函数的整体函数编写如下:

void SAPI_UartSendData( afIncomingMSGPacket_t *pMsg )
{
afAddrType_t dstAddr;
uint8 *pBuf;
uint8 len;
len=pMsg->hdr.status;
pMsg->hdr.event = UART_REPORT;
// pBuf=(uint8 *)pMsg+2;
pBuf=(uint8 *)((osal_event_hdr_t*)pMsg+1);
HalUARTWrite(HAL_UART_PORT_0,pBuf,len); //将串口数据写到PC(再写回去)
/*
dstAddr.addrMode = afAddrNotPresent;
dstAddr.endPoint = sapi_epDesc.simpleDesc->EndPoint;
*/
dstAddr.addrMode = (afAddrMode_t)Addr16Bit;
dstAddr.endPoint = sapi_epDesc.simpleDesc->EndPoint;
dstAddr.addr.shortAddr = 0x0000; //0x796F;0x0000
if ( AF_DataRequest( &dstAddr, &sapi_epDesc,
SENSOR_REPORT_CMD_ID,
len+2,
(uint8 *)pMsg,
0,
AF_ACK_REQUEST,
0 ) == afStatus_SUCCESS )
{
HalLedSet(HAL_LED_3,HAL_LED_MODE_TOGGLE);
}
else
{
// Error occurred in request to send.
HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);
} /**/

SPIMgr_AppFlowControl (true);

}



那么到此位置,传感节点的流程就写好了;
这里有个问题,就是数据传输的时候呢,必须设置具体的 目的地址,如果采用绑定的方法的话,那么一次传输的自己就会很少,
解决办法,小弟还没哟找到,所有,希望有人能指定一二。

至于,协调器的工作流程呢,很简单,因为系统事件里面本身就有对空中传输事件的处理函数,只要在其中加入HalUARTWrite();函数就可以直接将数据通过串口显示出来了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top