微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > (赏面吃)问题过于神奇,欢迎大神进来围观

(赏面吃)问题过于神奇,欢迎大神进来围观

时间:10-02 整理:3721RD 点击:


ZigBee问题:一、问题背景:
1、Z-stack,SAMPLE工程;
2、一个协调器,一个终端设备;
3、协调器、终端设备均与STM32连接,与协调器连接的以下称为MCU1,另一个称为MCU2;(模仿无线透传传输)
4、欲实现目的:
①MCU2有数据及时通过UART传至终端设备,然后终端设备向协调器点对点发送数据,显示屏显示收到的数据;
②MCU1有数据及时通过UART传至协调器,然后协调器向终端设备广播数据,显示屏显示收到的数据。

二、出现的问题:

协调器能够收到终端设备点对点发来的数据,终端设备收不到协调器广播来的数据。

三、预解决:

1、Packet Sniffer抓包分析:

①终端设备向协调器点对点发送数据数据包情况:



描述:1、终端设备请求一次数据,协调器应答一下,然后终端设备点对点发送,协调器应答;
2、协调器能够收到终端设备的数据;
②协调器广播数据数据包情况:



发现的问题:1、终端设备向协调器请求一次数据,协调器有时发送一个数据包,有时发送两个数据包(PS:这个数据包是期 望发送的数据包);
2、协调器发送数据包后,终端设备没有应答;
3、终端设备收不到协调器广播来的数据。
2、ZigBee、MCU角色互换,问题仍得不到解决!

四、主要程序附件:

1、事件处理函数如下:

  1. uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
  2. {
  3. afIncomingMSGPacket_t *MSGpkt;
  4. (void)task_id; // Intentionally unreferenced parameter

  5. if ( events & SYS_EVENT_MSG )//事件提取
  6. {
  7. MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  8. while ( MSGpkt )
  9. {
  10. switch ( MSGpkt->hdr.event )
  11. {
  12. case CMD_SERIAL_MSG:/*串口收到数据*/
  13. SampleApp_MyFunction_SendMessage((mtOSALSerialData_t *)MSGpkt);/*路由到空中*/
  14. break;

  15. // Received when a messages is received (OTA) for this endpoint
  16. case AF_INCOMING_MSG_CMD:/*天线收到数据*/
  17. SampleApp_MessageMSGCB( MSGpkt );/*传送至PC端或MCU*/
  18. break;

  19. default:
  20. break;
  21. }

  22. // Release the memory
  23. osal_msg_deallocate( (uint8 *)MSGpkt );

  24. // Next - if one is available
  25. MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  26. }

  27. // return unprocessed events
  28. return (events ^ SYS_EVENT_MSG);
  29. }
  30. // Discard unknown events
  31. return 0;
  32. }

复制代码

2、无线数据接收函数:

  1. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接收无线数据
  2. {
  3. switch ( pkt->clusterId )
  4. {
  5. #if defined (MCU)
  6. case SAMPLEAPP_MYCLUSTERID_P2P_SendMessage:

  7. HalUARTWrite ( //uint8 port
  8. 0,
  9. //uint8 *pBuffer
  10. pkt->cmd.Data,
  11. //uint16 length
  12. pkt->cmd.DataLength
  13. );
  14. break;

  15. #elif defined (SLAVE)
  16. case SAMPLEAPP_MYCLUSTERID_Broadcast_SendMessage:

  17. HalUARTWrite ( //uint8 port
  18. 0,
  19. //uint8 *pBuffer
  20. pkt->cmd.Data,
  21. //uint16 length
  22. pkt->cmd.DataLength
  23. );
  24. break;
  25. #endif
  26. }
  27. }

复制代码

3、串口数据发送函数:

  1. void SampleApp_MyFunction_SendMessage( mtOSALSerialData_t *cmdMsg )
  2. {
  3. #if defined (PC)/*MCU对SLAVE广播*/
  4. if ( AF_DataRequest( &SampleApp_Broadcast_DstAddr, &SampleApp_epDesc,
  5. //A valid cluster ID as specified by the Profile
  6. SAMPLEAPP_MYCLUSTERID_Broadcast_SendMessage,
  7. //Number of bytes of data pointed to by next param
  8. *cmdMsg->msg,//取出头字节
  9. //A pointer to the data bytes to send
  10. cmdMsg->msg+1, //指向发送的数据
  11. &SampleApp_TransID,
  12. AF_DISCV_ROUTE,
  13. AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  14. {
  15. }

  16. #elif defined (SLAVE)/*SLAVE对MCU点播数据*/
  17. if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,
  18. //A valid cluster ID as specified by the Profile
  19. SAMPLEAPP_MYCLUSTERID_P2P_SendMessage,
  20. //Number of bytes of data pointed to by next param
  21. *cmdMsg->msg,//取出头字节
  22. //A pointer to the data bytes to send
  23. cmdMsg->msg+1, //指向发送的数据
  24. &SampleApp_TransID,
  25. AF_DISCV_ROUTE,
  26. AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  27. {
  28. }
  29. #endif
  30. else
  31. {
  32. // Error occurred in request to send.
  33. }
  34. }

复制代码



新人小白,若有问的不妥的地方,还请大家多多包涵,也恳请大家帮忙查找问题,谢谢大家!


这个不懂,帮顶

不懂,希望有大神解答,也能来学习学习,帮顶

你的终端处于休眠模式,每次醒来向父节点请求数据,你在-DRFD_RCVC_ALWAYS_ON=TRUE,默认情况下是终端节点不接受父节点发送给他的应用层数据。

1、这个问题描述还需要很多条件:用那个版本的Zigbee,用哪种协议栈或者是自己建立的,时序和设置是否符合技术手册说明。协议栈免费提供的往往制定硬件设备,需要符合其定制的参数。
2、目前看应答没有问题,硬件OK,协议栈OK。因为,终端发广播连接信号已经被接受并连接,zigbee是执行多次握手协议的(视版本),所以主从之间的包交换肯定是Pass了才会后面点对点通讯成功。
3、问题在应用上。如4楼所述是最大可能,就是参数设定不符合自己的要求,因为参数会很多,需要对照。
4、还有一个可能是时序出了问题。对于zigbee,丢包很正常,因为功能设定就是自组网,所以不要求稳定连接。因此,发送和接受时序,信号强度都有关系,即使功能设计很好,但是如果在终端的接受波形区间,没有收到并处理好协调器的包,就死连接不上,而且信号强度小了,也视为无效包。zigbee可以根据信号强度进行三角定位的。
总之,先看设定参数,然后要分析时序,最后没办法了,还要排除射频的信号问题。越到后面越难排查,逻辑正确不能保证信号正确,另外,如果确实需要,最好先用模拟程序测试zigbee的组网,然后再开始程序设计,如果速成成,从厂家的例程修改,并理解。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top