求助:ZigBeeCC2530传感器组网采集终端串口接收丢包
时间:10-02
整理:3721RD
点击:
如题,我用两块开发板(一个作为协调器,一个作为终端节点)组网采集位移计信号,可是终端节点和位移计通过485进行通信时丢包严重,一直不知道问题出在哪里。现把我在协议中添加的代码附上,求大神指点,感激不尽!
终端初始化代码:
void GenericApp_Init( byte task_id )
{
halUARTCfg_t uartConfig; //串口
GenericApp_TaskID = task_id;
GenericApp_NwkState=DEV_INIT;
GenericApp_TransID = 0;
GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id = &GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReqs;
afRegister( &GenericApp_epDesc );
// RegisterForKeys( GenericApp_TaskID ); //按钮事件的注册,要响应按钮事件,这个必须添加
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_9600 ; //波特率设置
uartConfig.flowControl = FALSE;
uartConfig.callBackFunc = rxCB;
HalUARTOpen(0,&uartConfig); //串口初始化
}
终端串口采集代码:
static void rxCB(uint8 port,uint8 event)
{
HalUARTRead(0, &DATA,1);
if(DATA==0xaa)
{
HalUARTRead(0, &DATA,1);
if(DATA==0xaa)
{
SensorData[0]=SensorData[1]=0xaa;
for(uint8 i=2;i<12;i++)
{
HalUARTRead(0, &DATA,1);
SensorData[i]=DATA;
}
rec[0]=SensorData[7];
rec[1]=SensorData[8];
rec[2]=SensorData[9];
}
}
crc_function(SensorData,10,0xFFFF);
sign[0]=crc_L;
sign[1]=crc_H;
}
事件响应代码:
if(events&SEND_DATA_EVENT)
{
if((SensorData[10]==sign[0])&&(SensorData[11]==sign[1]))
{
GenericApp_SendTheMessage(); //发送
}
osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,100); //响应事件
return(events^SEND_DATA_EVENT);
}
注:我的数据格式是一帧12个字节,帧头两个字节是0xaa,最后两个字节是校验!
终端初始化代码:
void GenericApp_Init( byte task_id )
{
halUARTCfg_t uartConfig; //串口
GenericApp_TaskID = task_id;
GenericApp_NwkState=DEV_INIT;
GenericApp_TransID = 0;
GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id = &GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReqs;
afRegister( &GenericApp_epDesc );
// RegisterForKeys( GenericApp_TaskID ); //按钮事件的注册,要响应按钮事件,这个必须添加
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_9600 ; //波特率设置
uartConfig.flowControl = FALSE;
uartConfig.callBackFunc = rxCB;
HalUARTOpen(0,&uartConfig); //串口初始化
}
终端串口采集代码:
static void rxCB(uint8 port,uint8 event)
{
HalUARTRead(0, &DATA,1);
if(DATA==0xaa)
{
HalUARTRead(0, &DATA,1);
if(DATA==0xaa)
{
SensorData[0]=SensorData[1]=0xaa;
for(uint8 i=2;i<12;i++)
{
HalUARTRead(0, &DATA,1);
SensorData[i]=DATA;
}
rec[0]=SensorData[7];
rec[1]=SensorData[8];
rec[2]=SensorData[9];
}
}
crc_function(SensorData,10,0xFFFF);
sign[0]=crc_L;
sign[1]=crc_H;
}
事件响应代码:
if(events&SEND_DATA_EVENT)
{
if((SensorData[10]==sign[0])&&(SensorData[11]==sign[1]))
{
GenericApp_SendTheMessage(); //发送
}
osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,100); //响应事件
return(events^SEND_DATA_EVENT);
}
注:我的数据格式是一帧12个字节,帧头两个字节是0xaa,最后两个字节是校验!
看看看看看看
多长时间发送一次?你最好自己加一下握手协议防止丢包
10ms发送一次,现象是每一帧有时是对的,有时是全乱的,我感觉就是一帧接收不完就又接收下一帧了
那你可以通过延长发送时间间隔再试一下,这样就可以验证你的猜测了
10ms一次太快了,没有做一些协议肯定丢包
楼主找到解决方法了吗
我也在用zigbee模块,路由发到协调的30字节,发送间隔从几十ms到几百ms,都有丢包现象
485?
串口回调函数改成定时扫描会好很多