1、
SampleApp.c
#include "MT_UART.h" //串口头文件引用
SampApp_Init()
SampApp_TransID() = 0;
MT_UartInit();
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200 //38400
#define MT_UART_DEFAULT_OVERFLOW FALSE //TRUE
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登记任务号
void MT_UartInit ()
#ifdefined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc =MT_UartProcessZToolData;///
#elifdefined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
#else
uartConfig.callBackFunc = NULL;
#endif
void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
uint8 flag=0,i,j=0; //flag是判断有没有收到数据,j记录数据长度
uint8 buf[128]; //串口buffer最大缓冲默认是128,我们这里用128.
(void)event; // Intentionally unreferenced parameter
while (Hal_UART_RxBufLen(port)) //检测串口数据是否接收完成
{
HalUARTRead (port,&buf[j], 1); //把数据接收放到buf中
j++; //记录字符数
flag=1; //已经从串口接收到信息
}
if(flag==1) //已经从串口接收到信息
{
/* Allocate memory for the data */
//分配内存空间,为结构体内容+数据内容+1个记录长度的数据
pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+j+1);
//事件号用原来的CMD_SERIAL_MSG
pMsg->hdr.event = CMD_SERIAL_MSG;
pMsg->msg = (uint8*)(pMsg+1); // 把数据定位到结构体数据部分
pMsg->msg [0]= j; //给上层的数据第一个是长度
for(i=0;imsg [i+1]= buf[i];
osal_msg_send( App_TaskID, (byte *)pMsg ); //登记任务,发往上层
/* deallocate the msg */
osal_msg_deallocate ( (uint8 *)pMsg ); //释放内存
}
}
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
if ( events & SYS_EVENT_MSG )
MSGpkt(afIncomingMSGPacket_t*)osal_msg_receive( SampleApp_TaskID );
while ( MSGpkt )
switch ( MSGpkt->hdr.event )
//串口收到数据后由MT_UART层传递过来的数据,用该方法接收,编译时不定义MT相关内容
case CMD_SERIAL_MSG:
SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
break;
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)
{
uint8 i,len,*str=NULL; //len有用数据长度
str=cmdMsg->msg; //指向数据开头
len=*str; //msg里的第1个字节代表后面的数据长度
/********打印出串口接收到的数据,用于提示*********/
for(i=1;i<=len;i++)
HalUARTWrite(0,str+i,1 );
HalUARTWrite(0,"\n",1 );//换行
/*******发送出去,同无线数据传输********/
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_COM_CLUSTERID,//自己定义一个
len+1, // 数据长度
str, //数据内容
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg);
//
#define SAMPLEAPP_MAX_CLUSTERS 3 //2
//
#define SAMPLEAPP_PERIODIC_CLUSTERID 1
#define SAMPLEAPP_FLASH_CLUSTERID 2
///
#define SAMPLEAPP_COM_CLUSTERID 3
///
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
switch ( pkt->clusterId )
{
uint8 i,len;
//.....
///
case SAMPLEAPP_COM_CLUSTERID: //如果是串口透传的信息
len=pkt->cmd.Data[0];
for(i=0;icmd.Data[i+1],1);//发给PC机
HalUARTWrite(0,"\n",1); // 回车换行
break;
///
}
}