|
串口回调函数说明:
声明:
#define SPI_MGR_ZAPP_RX_READY 0x01
SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;
函数:
void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )
{
osal_event_hdr_t *msg_ptr;
uint16 length = 0;
uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);
//获取串口buf中数据的长度
……
if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))
{
if ( App_TaskID )//必须这里被注册
{
// 准备向上层发送数据
//如果接收状态为READY,并且数据长度大于0说明有数据了
if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0))
{
/*要读取这些数据了,先关闭接收!*/
SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );
/* 2 more bytes are added, 1 for CMD type, other for length */
msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length + sizeof(osal_event_hdr_t) );
//分配内存一个字节存放命令event,一个字节存放长度。剩下的存放length的内存存放数据
if ( msg_ptr )
{
msg_ptr->event = SPI_INCOMING_ZAPP_DATA;
msg_ptr->status = length;//这里状态存放了数据的长度
HalUARTRead( SPI_MGR_DEFAULT_PORT, (uint8 *)(msg_ptr + 1), length );//读入buf中的数值
//下面是触发函数
osal_msg_send( App_TaskID, (uint8 *)msg_ptr );
//这里我觉得还要打开串口,让它接收数据啊。怎么没有来这么一句话
//SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY );
}
}
}
}
}
关闭接收函数;
void SPIMgr_AppFlowControl ( bool status )
{
/* Make sure only update if needed */
if (status != SPIMgr_ZAppRxStatus )
{
SPIMgr_ZAppRxStatus = status;
}
/* App is ready to read again, ProcessZAppData have to be triggered too */
if (status == SPI_MGR_ZAPP_RX_READY)
{
SPIMgr_ProcessZAppData(SPI_MGR_DEFAULT_PORT, HAL_UART_RX_TIMEOUT );
}
}
因为在 SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );中SPI_MGR_ZAPP_RX_NOT_READY=0,而SPIMgr_ZAppRxStatus=1;所以会执行SPIMgr_ZAppRxStatus = status;,即接收状态SPIMgr_ZAppRxStatus =0;不再满足SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY。所以不接收数据了。
我认为在串口回调函数加上SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY )使得串口处理完一次后立即处理下一次。 |
|