请选择 进入手机版 | 继续访问电脑版
查看: 5015|回复: 4

串口回调函数一点认识

[复制链接]
tuzhuke 发表于 2010-11-21 11:42:38 | 显示全部楼层 |阅读模式
串口回调函数说明:
声明:
#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 )使得串口处理完一次后立即处理下一次。
outman 发表于 2010-11-21 23:16:28 | 显示全部楼层
支持楼主的共享,加油~~~
xiaoyige 发表于 2011-1-27 14:04:49 | 显示全部楼层
顶顶顶顶顶顶
真诚星君 发表于 2011-4-30 20:26:18 | 显示全部楼层
力顶。。!!
lizheng86312 发表于 2012-8-29 13:28:04 | 显示全部楼层
学到东西了。顶。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表