4255|13

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

发送字符串导致死循环:( [复制链接]

一个无线Zigbee网络的两个设备对传,发射端有一串比较长的字符串需要发送,我的方法是:把它分割成适合长度的字符串,先发送第一个小字符串,接着进入一个循环,等待接收机返回的确认信号后再发下一串字符串

k =StringLength/SuitLength; //k定义需要循环的次数
for(n=0;n {
        MemCpy(SendMsg, WanttoSend+SuitLength*n, SuitLength);  //每次复制一串适合长度的小字符串给SendMsg
        Cnfreceived = 0;  //全局变量
        SendMessage();   //发送SendMsg字符串
        do{
                __asm nop;
                __asm nop;
                __asm nop;
        }
        while(Cnfreceived != 1);  //若收到接收端返回的确认信号,Cnfreceived会置1
}
为什么每次都会死在do while循环那里?如果把do while屏蔽掉,接收端就能收到分割后的最后一个小字符串,并且发送端也会收到一个接收端返回的确认。
实在不知道是哪里出了问题,请各位大侠指教!

最新回复

我用的是Freescale的MC13213,我只用到802.15.4协议,没用到Z-Stack,现在由于各种原因,老板也要求我们换成CC2430了。 CC2430的协议栈都是有OS支持的?那程序代码是不是会有很多与MC13213不一样了 :(  详情 回复 发表于 2007-10-12 14:58
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你用的是什么的ZIGBEE模块?还有协议?

这样看你的协议实现形态以及开放的API形态

咱再做定论....

 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Cnfreceived 什么时候置位?接收是中断方式的?接收中断的代码呢?贴出来给大家分析
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
Cnfreceived 没有置位

//若收到接收端返回的确认信号,Cnfreceived会置1
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
协议是802.15.4,下面是MAC公共端口子层(MCPS)处理收到数据的一段代码:
static void HandleMcpsInput(Msg_t *pMsgIn)
{
  switch(pMsgIn->msgType)
  {
    /* The MCPS-Data confirm is sent by the MAC to the network
    or application layer when data has been sent. */
    case gMcpsDataCnf_c:     //若收到的消息类型是数据确认
        Cnfreceived = 1;     //Cnfreceived置位
      if(mcPendingPackets)
      {        
        mcPendingPackets--;  //未发送的分组个数减一
      }
      break;
    ……
     }
}
如果仅发送一串小的字符串,就可以检测到Cnfreceived的确置1了,但是一旦循环发送,就等不来Cnfreceived置1,死在循环等待那里了。是不是MCU会对循环等待有时间上的什么要求啊?小弟刚接触这方面的知识,还请各位大侠多多指点!
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 
do{
__asm nop;
__asm nop;
__asm nop;
}
while(Cnfreceived != 1);  //若收到接收端返回的确认信号,Cnfreceived会置1

忙等待,占据CPU,收数部分没有机会置Cnfreceived
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
    忙等待,占据CPU,收数部分没有机会置Cnfreceived

碰到这种情况该怎么处理?
或者是还有其他的方法来判断已经收到确认帧,可以发送下一个packet了?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
思路没问题.

偶在做的CHIPCON CC2430的用它提供的栈,也实现过类似的,没这些个问题...

很畅快,嘿嘿
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

9
 
其他的字符串都丢失了吗?只能接收到最后一次的数据?

你可以同时看看你的接收端,是否有接受到前面的数据,同时在接收到数据以后是否有及时的发送出确认帧!先确认这个问题。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题找到了。不该用while循环来等待那个全局变量的置位,在主循环中调用这个空循环,让它没有办法进行下一步对其他事件的判断,所以存在发送缓存中的数据根本没有发出去。
然后我在主循环中改用if来判断那个全局变量是否置位,
uint8_t * p;
if(Cnfreceived == 1)
   {
   p = WanttoSend;
   if(messagelength)
   {
      if(messagelength>SuitLength)
      {
       MemCpy(WanttoSendMsg, p, SuitLength);
       pp +=SuitLength;
       messagelength -=SuitLength;
       }
     else{
       MemCpy(WanttoSendMsg, p, messagelength);
       messagelength  = 0;
       }
   SendMessage();
   Cnfreceived = 0;
   }
}
也出现了错误,估计是数据长度的定义不对,收到的字符串长度很短,不过还好,总算没有再死机了,呵呵。
大家帮我看看哪里有什么错误。谢谢!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

11
 
呵呵,搞定了。是数据格式定义错误:P

谢谢大家了,有回复的都加分:)
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
咦?好像还不能马上给分?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
明白了,你的协议栈没有OS的支持,呵呵...

应该很早的版本吧?
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

14
 
我用的是Freescale的MC13213,我只用到802.15.4协议,没用到Z-Stack,现在由于各种原因,老板也要求我们换成CC2430了。
CC2430的协议栈都是有OS支持的?那程序代码是不是会有很多与MC13213不一样了 :(
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表