协议栈版本:ZStack-1.4.3-1.2.1
一、串口的初始化
WWW_P※LCJS_CO※M-PLC-技-.术_网
//系统初始化
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
byte osal_init_system( void )
W1WW_P4LCJS_COM-PLC-技.术_网
{
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
……
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
osalInitTasks();//系统任务初始化
WWW_PLCJS@_COM%-PLC-技.术_网
……
WWW_P※LCJS_CO※M-PLC-技-.术_网
}
P.L.C.技.术.网——可编程控制器技术门户
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
//任务初始化
WWW_PL※CJS_COM-PLC-技.术_网
void osalInitTasks( void )
——可——编——程——控-制-器-技——术——门——户
{
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
……
plcjs.技.术_网
#if defined( MT_TASK )//如果定义了MT_TASK就初始化MT任务,所以要使用uart必须编译MT_TASK
WWW_PLC※JS_COM-PmLC-技.术_网
MT_TaskInit( taskID );
WWW_P※LCJS_COM-PLC-)技.术_网
#endif
WW.W_PLCJS_COM-PLC-技.术_网
……
WWW_P※LCJS_COM-PLC-)技.术_网
}
WW.W_PLC※JS_C,OM-PL,C-技.术_网
//MT_TASK初始化
WWW_PL※CJS_COM-PLC-技.术_网
void MT_TaskInit( byte task_id )
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
{
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
MT_TaskID = task_id;//分配任务ID
WWW_P※LCJS_COM-PLC-)技.术_网
……
W1WW_P4LCJS_COM-PLC-技.术_网
SPIMgr_Init();//SPI(UART)管理初始化
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
WWW_P※LCJS_CO※M-PLC-技-.术_网
WW.W_PLCJS_COM-PLC-技.术_网
} /* MT_TaskInit() */
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
——可——编——程——控-制-器-技——术——门——户
WW.W_PLCJS_COM-PLC-技.术_网
//SPI(UART)管理初始化
——可——编——程——控-制-器-技——术——门——户
void SPIMgr_Init ()
WWW_PL※CJS_COM-PLC-技.术_网
{
WWcW_PLCJS_COM-PLC-技.术_网
halUARTCfg_t uartConfig;
WWW_PLCJS_COM-PLC-技.术_网
/* Initialize APP ID */
——可——编——程——控-制-器-技——术——门——户
App_TaskID = 0;//应用层TaskID初始化为0,在后面应用层如果想使用uart需要注册该TaskID
WWW.PLCJS.COM——可编程控制器技术门户
WWW_PLC※JS_COM-PmLC-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
/* UART Configuration */
WWcW_PLCJS_COM-PLC-技.术_网
uartConfig.configured = TRUE;
P.L.C.技.术.网——可编程控制器技术门户
uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;
WW.W_PLC※JS_C,OM-PL,C-技.术_网
uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;
WWcW_PLCJS_COM-PLC-技.术_网
uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;
WWW_PLC※JS_COM-PmLC-技.术_网
uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;
——可——编——程——控-制-器-技——术——门——户
uartConfig.intEnable = TRUE;
WWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
uartConfig.callBackFunc = SPIMgr_ProcessZToolData; //回调函数
P.L.C.技.术.网——可编程控制器技术门户
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
uartConfig.callBackFunc = SPIMgr_ProcessZAppData; //回调函数
WWW_PLCJS@_COM%-PLC-技.术_网
#else
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
uartConfig.callBackFunc = NULL;
WW.W_PLC※JS_C,OM-PL,C-技.术_网
#endif
WWW_PLCJS@_COM%-PLC-技.术_网
/* Start UART */
W1WW_P4LCJS_COM-PLC-技.术_网
#if defined (SPI_MGR_DEFAULT_PORT)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig); //打开默认串口
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
#else
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
……
WWW_P※LCJS_CO※M-PLC-技-.术_网
}
WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
plcjs.技.术_网
WWW_PLCJS_COM-PLC-技.术_网
到这里串口的初始化基本就完成了,还有个打开串口,先不下去了,下面的水是越来越浑,过几天总结底层的…
WWW_P※LCJS_CO※M-PLC-技-.术_网
二、串口的事件处理
WWW.PLCJS.COM——可编程控制器技术门户
WWW_PLCJS_COM-PLC-技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
//系统主循环
plcjs.技.术_网
void osal_start_system( void )
WW.W_PLC※JS_C,OM-PL,C-技.术_网
{
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
……
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
Hal_ProcessPoll(); // 串口与定时器轮询函数
WWW_PLCJS_COM-PLC-技.术_网
……
WWcW_PLCJS_COM-PLC-技.术_网
}
P.L.C.技.术.网——可编程控制器技术门户
WWW_PL※CJS_COM-PLC-技.术_网
WWW_PL※CJS_COM-PLC-技.术_网
// 串口与定时器轮询函数
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
void Hal_ProcessPoll ()
WWW_P※LCJS_COM-PLC-)技.术_网
{
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
HalTimerTick();
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
WWW.PLCJS.COM——可编程控制器技术门户
#if (defined HAL_UART) && (HAL_UART == TRUE)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
HalUARTPoll();
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
#endif
WWW_P※LCJS_CO※M-PLC-技-.术_网
}
WWW.PLCJS.COM——可编程控制器技术门户
plcjs.技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
//串口轮询函数
P.L.C.技.术.网——可编程控制器技术门户
void HalUARTPoll( void )
WWcW_PLCJS_COM-PLC-技.术_网
{
WW.W_PLC※JS_C,OM-PL,C-技.术_网
……//这里会根据是DMA还是普通串口有两种不同的轮询方式,这里说普通串口
WWW.PLCJS.COM——可编程控制器技术门户
#if HAL_UART_ISR
WWcW_PLCJS_COM-PLC-技.术_网
#if HAL_UART_DMA
WWW_PLCJS_COM-PLC-技.术_网
if ( cfg->flag & UART_CFG_DMA )
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
{
WWcW_PLCJS_COM-PLC-技.术_网
pollDMA( cfg );
WW.W_PLCJS_COM-PLC-技.术_网
}
WWW_PL※CJS_COM-PLC-技.术_网
else
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
#endif
WWW_PLCJS_COM-PLC-技.术_网
{
WWW_PLC※JS_COM-PmLC-技.术_网
pollISR( cfg );
WWW_PLC※JS_COM-PmLC-技.术_网
}
P.L.C.技.术.网——可编程控制器技术门户
#elif HAL_UART_DMA
WWW_PL※CJS_COM-PLC-技.术_网
pollDMA( cfg );
W1WW_P4LCJS_COM-PLC-技.术_网
#endif
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
……
WWcW_PLCJS_COM-PLC-技.术_网
}
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
//普通串口轮询函数
WWW.PLCJS.COM——可编程控制器技术门户
static void pollISR( uartCfg_t *cfg )
WW.W_PLCJS_COM-PLC-技.术_网
{
WWW.PLCJS.COM——可编程控制器技术门户
……
WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
轮询完事再次回到void HalUARTPoll函数中,看是否触发事件,如果触发了HAL_UART_RX_FULL、HAL_UART_RX_ABOUT_FULL、HAL_UART_RX_TIMEOUT三个中任意一个就调用回调函数处理。
P.L.C.技.术.网——可编程控制器技术门户
WWW_P※LCJS_COM-PLC-)技.术_网
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
if ( evt && cfg->rxCB )
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
{
——可——编——程——控-制-器-技——术——门——户
cfg->rxCB( ((cfg->flag & UART_CFG_U1F)!=0), evt );
WWW.PLCJS.COM——可编程控制器技术门户
}
WW.W_PLCJS_COM-PLC-技.术_网
plcjs.技.术_网
WWW_P※LCJS_COM-PLC-)技.术_网
//串口回调函数
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
#define SPI_MGR_ZAPP_RX_READY 0x01
WWW_PLCJS_COM-PLC-技.术_网
SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;
WWcW_PLCJS_COM-PLC-技.术_网
函数:
plcjs.技.术_网
void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )
——可——编——程——控-制-器-技——术——门——户
{
W1WW_P4LCJS_COM-PLC-技.术_网
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
——可——编——程——控-制-器-技——术——门——户
osal_event_hdr_t *msg_ptr;
WWcW_PLCJS_COM-PLC-技.术_网
uint16 length = 0;
WWW_PLC※JS_COM-PmLC-技.术_网
uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
//获取串口buf中数据的长度
WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_P※LCJS_CO※M-PLC-技-.术_网
……
WW.W_PLC※JS_C,OM-PL,C-技.术_网
if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))
WWcW_PLCJS_COM-PLC-技.术_网
{
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
if ( App_TaskID )//必须这里被注册
WW.W_PLCJS_COM-PLC-技.术_网
{
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
// 准备向上层发送数据
WW.W_PLCJS_COM-PLC-技.术_网
//如果接收状态为READY,并且数据长度大于0说明有数据了
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0))
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
{
WWW_PLCJS@_COM%-PLC-技.术_网
/*要读取这些数据了,先关闭接收!*/
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );
WW.W_PLCJS_COM-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
W1WW_P4LCJS_COM-PLC-技.术_网
/* 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) );WWW_P※LCJS_COM-PLC-)技.术_网