首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一个smac wireless Uart 的问题

一个smac wireless Uart 的问题

小弟基于1321SRB,利用smac写了一个简单的wireless Uart的程序。程序的基本思路如下:
一共两个节点,其中一个发数据包(数据包长度在10个字节以内),发完数据包后等待应答信息,如果在一定的时间内(10ms)没有等到应答信息,就重发数据包,重发2次后如果还没有等到应答信息就进入发送失败状态。另外一个收到数据包后回复一个应答信息(长度在10个字节以内),然后进入接收状态。
问题是:每隔10s发一次数据包,有差不多15%的几率进入发送失败状态,有15%的几率会出现重发现象,通过一次或两次重发成功收到应答信号,有70%的几率能够一次性收到应到信号。
两个节点相隔不到一米,采用最大功率发射,不知道是我软件上的问题还是正常的无线通信丢包现象。请高手们指点一下。万分感谢!
你先利用SMAC程序里面的range test看看你的RF性能如何,如果性能可以的话就是你软件的问题了。
把定时去掉之后,就不会出现重发的情况了,也就是说一切正常。我的定时程序是
......
delay10ms(1); ////////后来用LOW_POWER_WHILE();替换该句指令就一切正常了
if (gi8AppStatus != IDLE_STATE)
{
gi8AppStatus = TIMEOUT_STATE;
}
......

void delay10ms(UINT16 count)
{
UINT16 u16Match;
TPM1SC |= 0x40; //////////////////////////interrupt on;
u16Match = gu16msTimer + count;
while (gu16msTimer != u16Match);
LOW_POWER_WHILE();
TPM1SC &= ~0x40;
}
void TimerInit()
{
TPM1MOD = 625; /* Set the timer for a 26ms timer rate (1/8E6) * 128 * 625 = 10msec */
/* Timer rate = (1/BUSCLOCK) * TIMER_PRESCALER * TIMER MOD */
TPM1SC = 0x0F; /* Timer divide by 128. (16uS timebase for 8MHz bus clock). interrupt on*/

}
请高手看看错出在哪里
delay10ms这个函数有点问题
gu16msTimer是在中断里面改变值的吧?初始值多少,中断里面进行的是什么操作?
u16Match = gu16msTimer + count;这个语句感觉应该是乘,不是加?

LOW_POWER_WHILE();是wait,靠中断唤醒,定时器中断?
用LOW_POWER_WHILE();等待中断不对吗?我看wireless Uart中都是通过LOW_POWER_WHILE();等待RF接收的数据的,也是等的中断呀?中断服务程序:
interrupt void IRQTimer1(void) {

gu16msTimer++;//gu16msTimer是全局变量

TPM1SC &= ~0x80; /* clear the interrupt */
}
请版主指点一下,谢谢!
定时器的中断标志位清零应该先读一下TPM1SC,然后再对标志位写零
TPM1SC &= ~0x80;这样写,编译器有可能只有对标志位写零的步骤
楼主能否将你的程序发下我邮箱,knightccc@126.com参考下呢?
我正遇到类似问题,搂住能否把工程贴出来,共同讨论!
G情,Z注,D调,+值,*福。。。
贴出来大家一起讨论
返回列表