This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2530串口死机问题



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); //释放内存
}
}