概述
ZigBee串口收发数据
本文转载自:http://blog.chinaunix.net/space.php?uid=20788636&do=blog&id=1841411
voidHalDriverInit (void)
{
...................................
#if(defined HAL_UART) && (HAL_UART ==TRUE)
#endif
....................................
}
#ifndef HAL_UART
#if (defined ZAPP_P1) ||(defined ZAPP_P2) || (defined ZTOOL_P1) || (definedZTOOL_P2)
#define HAL_UARTTRUE
#else
#define HAL_UARTFALSE
#endif
#endif
Data reception on theUART is initiatedwhen a 1 is written to the
The UART will thensearch for a valid start bit on the RXDx input pin and setthe
UxCSR.ACTIVE bit high.When a validstart bit has been detected thereceived
#ifHAL_UART_0_ENABLE
HAL_ISR_FUNCTION(halUart0RxIsr, URX0_VECTOR )
{
}
#endif
SerialApp.c中有下面的定义
#if !defined( SERIAL_APP_RX_MAX)
#endif
SerialApp_Init()函数中有下面的赋值,
HalUARTOpen()函数中有下面的赋值:所以其cfg->rxMax=128,
cfg->rxMax =config->rx.maxBufSize;
而if (cfg0->rxHead == cfg0->rxMax)这一句判断也说明的很清楚,一旦这个计数达到了定义的最大接收数量,也就是说已经把rxBuf存储空间占满了,那么就不能在继续存放了。
void Hal_ProcessPoll()
{
#if (defined HAL_UART)&& (HAL_UART == TRUE)
#endif
}
下面是HalUARTPoll();函数的源代码,在这里有对接收到的数据进行处理的程序。
void HalUARTPoll( void)
{
#if ( HAL_UART_0_ENABLE |HAL_UART_1_ENABLE )
#ifHAL_UART_0_ENABLE
#endif
#ifHAL_UART_1_ENABLE
#endif
//系统上电后,睡眠定时器就会自动启动做自增计数ST0即睡眠定时器启动到现在计算值的最低8位
//是使用DMA方式还是使用中断方式
#if HAL_UART_ISR
#if HAL_UART_DMA
{
#endif
#elif HAL_UART_DMA
#endif
//已保存的数据已经超过了安全界限,发送接收满事件
//rxBuf[]接收到预设值(默认80字节),则触发事件,为什么是80,在上一篇转载的文章中有介绍,这里重点关注执行的流程。
{
//超时事件
//如果发生事件,并且配置了回调函数则调用回调函数
{
//(cfg->flag& UART_CFG_U1F)!=0)判读是那个串口,如果是串口1则为1,否则为0
#ifHAL_UART_0_ENABLE
#ifHAL_UART_1_ENABLE
#endif
#endif
#else
#endif
}
说明:(1)下面我们看一下pollISR()函数
static void pollISR( uartCfg_t*cfg )
{
//计算rxBuf[]中还有多少数据没有读出(以字节为单位)
//如果串口没有接收到数据,也就是说没有发生过串口接收中断,那么cfg应为是为空的,则cnt=0如果发生了串口中断,则cnt计算出串口缓存中还有多少数据没有读出,这个缓存并不是硬件寄存器的缓存,而是程序中开辟一段空间
//这里是针对流控制的,如果又有新的数据接收到了那么就要重置超时时间(超时时间由睡眠定时器来控制),而且需要把已经读出的数据数目减去!
}
#endif
pollISR()函数主要作用就是设置rxTick和rxCn,
//关于安全界限,在程序中有下面一段:
//如果声明了流控制,为保证数据的正确接收需要在RX缓存区中预留出足够的空间。CC2430可以使用的最大串口波特率为115.2k。这个安全界限的数字跟使用的波特率还有串口tick有关。具体参考《Z-STACK问题之串口结构uartCfg_t乱说》文章。
cfg->rxCB(((cfg->flag & UART_CFG_U1F)!=0), evt);
第一个参数主要是判断,是UART1还是UART0.第二个参数是触发的事件类型,那个个回调函数,具体是指向函数呢?
#else
#endif
其中,在HalUARTOpen()函数中,有下面的一条语句,
uint8 HalUARTOpen( uint8 port,halUARTCfg_t *config )
{
cfg->rxCB =config->callBackFunc;
...................
}
static void rxCB( uint8 port,uint8 event )
{
}
#endif
在事件处理函数中,有下面的判断。
UINT16 SerialApp_ProcessEvent(uint8 task_id, UINT16 events )
{
........................
if ( events &SERIALAPP_MSG_SEND_EVT )
.........................
}
static void SerialApp_SendData(uint8 *buf, uint8 len )
{
//在设定的时间内没有发送成功,则重新发送。
}
void SerialApp_ProcessMSGCmd(afIncomingMSGPacket_t *pkt )
{
rspBuf[3] = HI_UINT16( delay);
//发送接收数据响应命令
}
UINT16 SerialApp_ProcessEvent(uint8 task_id, UINT16 events )
{
//执行发送过来消息命令的回调函数
SerialApp_ProcessMSGCmd(MSGpkt );
//发送数据的事件,这里是串口通过CC2430发送数据到另一个设备
//重发数据的事件,如果发送数据没有成功的话
//发送接收数据响应的重发事件
#ifSERIAL_APP_LOOPBACK
#endif
}
最后
以上就是无心仙人掌为你收集整理的ZigBee串口收发数据的全部内容,希望文章能够帮你解决ZigBee串口收发数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复