|
simpliciTI的polling with AP例程的一些理解
[复制链接]
在SimpliciTI的星状网络拓扑中,看了polling with AP的例程,其中关于串口通信中,有发送字符串函数和中断接收函数
串口发送字符串函数是比较通用的,
void UartSendWord(uchar *msg ,unsigned int lenth)
{
for(i=0;i
{
U0DBUF=*msg++;
while(!UTX0IF);
UTX0IF=0;
}
}
串口接收函数是通过中断来完成的
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR(void)
{
uart_R.Buf[uart_R.count++]=U0DBUF;
if((Uart_s==EMPTY)||(Uart_s==RXING)&&(Uart_R.count<=FRAMELENTH)) //判断串口状态
{
Uart_s=RXING;
RestTimer(3);
}
else
{
Uart_s=RXOVER;
Uart_R.Flag=ture;
}
}
而在AP和ED的主程序中,首先是固定的一些重要语句:
BSP_Init();------------------------------------------------------------------------------硬件目标板初始化
SMPL_Ioctl(IOCTL_OBJ_ADDR,IOCTL_ACT_SET,&lAddr)-----------------------设置本机地址(AP或者ED的地址)
SMPL_Init()-----------------------------------------------------------------------------Radio和协议栈初始化
当然AP和ED的SMPL_Init()是有区别的,AP的SMPL_Init()是这样的SMPL_Init(sCB),AP 引入了回调函数sCB,而ED并没有引入该回调函数。
AP引入回调函数sCB主要是通过lid来识别接收到的数据是ED请求加入网络的数据还是ED发给AP的通信数据。
sCB函数如下
static uint8_t sCB(linkID_t lid)
{
if(lid)
{
sPeerFrameSem++;
}
else
{
sJoinSem++;
}
}
如果是ED请求加入网路的数据,那么AP允许该ED加入网络,并分配应用程序接口PORT给它。不过,请注意PORT是设备加入网络,在网络
连接的过程中分配的,不受用户的干涉。
然后ED通过SMPL_Link(linkID_t *linkID) 向ED发送广播link帧,等待应答;AP通过SMPL_LinkListen(linkID_t *linkID)侦听到广播link帧,
就返回一个应答信号,ED一接到这个应答信号,连接就建立起来了,于是AP和ED之间就可以通信,不过,它们之间的通信需要经过串口。
于是上面讲的串口发送和接收函数就起到作用了。
同时协议栈提供了两个API函数用于无线的发送和接收。那就是SMPL_Send(linkID_t lid,uint8_t *msg, uint8_t len)和
SMPL_Receive(linkID_t lid,uint8_t *msg, uint8_t len)
|
|