发送字符串导致死循环:(

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

k =StringLength/SuitLength; //k定义需要循环的次数
for(n=0;n<k;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屏蔽掉,接收端就能收到分割后的最后一个小字符串,并且发送端也会收到一个接收端返回的确认。
实在不知道是哪里出了问题,请各位大侠指教!
...全文
113 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sckaty 2007-10-12
  • 打赏
  • 举报
回复
我用的是Freescale的MC13213,我只用到802.15.4协议,没用到Z-Stack,现在由于各种原因,老板也要求我们换成CC2430了。
CC2430的协议栈都是有OS支持的?那程序代码是不是会有很多与MC13213不一样了 :(
sckaty 2007-10-11
  • 打赏
  • 举报
回复
问题找到了。不该用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;
}
}
也出现了错误,估计是数据长度的定义不对,收到的字符串长度很短,不过还好,总算没有再死机了,呵呵。
大家帮我看看哪里有什么错误。谢谢!
wxf0204 2007-10-11
  • 打赏
  • 举报
回复
其他的字符串都丢失了吗?只能接收到最后一次的数据?

你可以同时看看你的接收端,是否有接受到前面的数据,同时在接收到数据以后是否有及时的发送出确认帧!先确认这个问题。
lbing7 2007-10-11
  • 打赏
  • 举报
回复
明白了,你的协议栈没有OS的支持,呵呵...

应该很早的版本吧?
sckaty 2007-10-11
  • 打赏
  • 举报
回复
咦?好像还不能马上给分?
sckaty 2007-10-11
  • 打赏
  • 举报
回复
呵呵,搞定了。是数据格式定义错误:P

谢谢大家了,有回复的都加分:)
sckaty 2007-10-10
  • 打赏
  • 举报
回复
忙等待,占据CPU,收数部分没有机会置Cnfreceived

碰到这种情况该怎么处理?
或者是还有其他的方法来判断已经收到确认帧,可以发送下一个packet了?
sterrys 2007-10-10
  • 打赏
  • 举报
回复
do{
__asm nop;
__asm nop;
__asm nop;
}
while(Cnfreceived != 1); //若收到接收端返回的确认信号,Cnfreceived会置1

忙等待,占据CPU,收数部分没有机会置Cnfreceived
sckaty 2007-10-10
  • 打赏
  • 举报
回复
协议是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会对循环等待有时间上的什么要求啊?小弟刚接触这方面的知识,还请各位大侠多多指点!
sterrys 2007-10-10
  • 打赏
  • 举报
回复
Cnfreceived 没有置位

//若收到接收端返回的确认信号,Cnfreceived会置1
lbing7 2007-10-10
  • 打赏
  • 举报
回复
思路没问题.

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

很畅快,嘿嘿
LanceJin 2007-10-09
  • 打赏
  • 举报
回复
Cnfreceived 什么时候置位?接收是中断方式的?接收中断的代码呢?贴出来给大家分析
lbing7 2007-10-09
  • 打赏
  • 举报
回复
你用的是什么的ZIGBEE模块?还有协议?

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

咱再做定论....

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧