ZigBee终端通过串口接收来自传感器的数据,然后上发到协调器,
测试一段时间后,发现终端死机了,串口的接收代码如下,请问是否有什么问题?
感觉是不是缓存满了没有清除?
static void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg){ uint8 len,*str=NULL; //len有用数据长度
str=cmdMsg->msg; //指向数据开头
len=*str; //msg里的第1个字节代表后面的数据长度
zclReportCmd_t *pReportCmd;
if((len==19)&&(str[1]==0x01)&&(str[2]==0x03)&&(str[3]==0x0E))//有效数据长度
{
HalLedSet( HAL_LED_2, HAL_LED_MODE_BLINK );//蓝灯闪烁 zclSampleSw_SensorData[0]=0x13;//有效数据长度19
for(uint8 i=1;i<20;i++)
zclSampleSw_SensorData[i]=str[i];
//HalUARTWrite(0,zclSampleSw_SensorData,20 );
//上报 pReportCmd = osal_mem_alloc( sizeof(zclReportCmd_t) + sizeof(zclReport_t) );
if ( pReportCmd != NULL )
{
pReportCmd->numAttr = 1;
pReportCmd->attrList[0].attrID = ATTRID_BASIC_DEVICE_ENABLED;//数据类型
pReportCmd->attrList[0].dataType = ZCL_DATATYPE_CHAR_STR;
pReportCmd->attrList[0].attrData = (void *)(&zclSampleSw_SensorData);
//数据类别 zcl_SendReportCmd( SAMPLELIGHT_ENDPOINT, &zclSampleLight_DstAddr,
ZCL_CLUSTER_ID_GEN_ON_OFF,
pReportCmd, ZCL_FRAME_SERVER_CLIENT_DIR, TRUE, bdb_getZCLFrameCounter() );
}
osal_mem_free( pReportCmd ); }
}
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;i<j;i++) //从第二个开始记录数据 pMsg->msg[i+1]=buf[i]; osal_msg_send(App_TaskID, (byte *)pMsg); //登记任务,发往上层 /* deallocate the msg */ osal_msg_deallocate((uint8 *)pMsg); //释放内存 }}
Viki Shi:
怀疑是缓存的问题,你清除缓存测试下是否有改善
user5367314:
回复 Viki Shi:
请问在哪里清除?怎么清?
Viki Shi:
回复 user5367314:
你先尝试一下增大缓存,MT_UART_DEFAULT_MAX_RX_BUFF和MT_UART_DEFAULT_MAX_TX_BUFF
user5367314:
回复 Viki Shi:
osal_msg_deallocate和osal_mem_free什么区别?我看有的地方收发之后都用到
user5367314:
回复 Viki Shi:
应该不是这个原因,传感器每10秒来一次数据,每次长度是20字节,这个应该不会超的,
但是测试几个小时就死了,估计是其他的原因吧
Viki Shi:
回复 user5367314:
osal_msg_deallocate内部还是调用osal_mem_free实现功能的
user5367314:
回复 Viki Shi:
2530设置为低功耗模式后,串口就无法接收数据了,非睡眠模式可以接收,
POWER_SAVING和-DRFD_RCVC_ALWAYS_ON=FALSE就收不到数据了,可能是什么原因?
Viki Shi:
回复 user5367314:
低功耗下晶振关闭,无法使用串口,需唤醒设备再进行操作
user5367314:
回复 Viki Shi:
请指教,低功耗模式下,使用串口具体该怎么操作?
1.知道什么时候要使用串口,怎么操作?
2.如果接的是传感器,终端不知道什么来串口信息,该怎么操作?