打印

不停的等待GPRS传过来的数据

[复制链接]
2758|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renyaq|  楼主 | 2013-7-23 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
chuxh| | 2013-7-23 19:41 | 只看该作者
程序跑着时正常吗?

使用特权

评论回复
板凳
renyaq|  楼主 | 2013-7-23 19:45 | 只看该作者
串口有时接收和发送的速度慢下来了,就像突然换了时钟,不知道是不是上面的原因?

使用特权

评论回复
地板
chuxh| | 2013-7-23 19:46 | 只看该作者
定时器中断 进出一次要多久

使用特权

评论回复
5
llljh| | 2013-7-23 19:50 | 只看该作者
是可以通过_EINT()使能中断进行中断嵌套的,只是这时中断没有优先级了,只要有中断就会嵌套进入中断。

不知道楼主的程序中还有没有别的中断?

使用特权

评论回复
6
llljh| | 2013-7-23 19:50 | 只看该作者
速度慢下来是指的发送频率变低了还是传输的波特率降低了?

使用特权

评论回复
7
ousj| | 2013-7-23 19:54 | 只看该作者
详细说说用了几个中断,每个中断的优先级以及做了什么事情,执行需要多长时间

使用特权

评论回复
8
llljh| | 2013-7-23 19:54 | 只看该作者
中断嵌套后的时序楼主推敲一下啊

使用特权

评论回复
9
renyaq|  楼主 | 2013-7-23 20:08 | 只看该作者
中断优先级可以自己设吗?
我用到两个中断,串口0中断和定时器A中断。
定时器2秒一次中断,
担心怕定时器进中断的时候,GPRS向串口0传过来数据,所以在定时器中断优先级要高于串口0.
速度慢下来是指,系统时钟好像慢了。

使用特权

评论回复
10
renyaq|  楼主 | 2013-7-23 20:08 | 只看该作者
中断程序如下:
// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
//***********************串口1看结果*************************
  while (!(IFG2 & UTXIFG1));                           
  TXBUF1 = RXBUF0;   
// ************************************************************/
  RecBuf[J]=RXBUF0;
  J++;
  LPM3_EXIT;
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  _EINT();
  switch( TAIV )
  {
    case  2:  break;                                     // CCR1 not used
    case  4:  break;                                     // CCR2 not used
    case 10:  I++;
      LPM3_EXIT ;                              // 跳出LPM3
                  break;
  }

使用特权

评论回复
11
小小猫咪| | 2013-7-23 20:10 | 只看该作者
如果2s定时中断要求不是很严格,可以通过查询2s定时的方法。
即查询定时器中断标志,但是中断发生后不进入中断函数。

使用特权

评论回复
12
dingy| | 2013-7-23 20:10 | 只看该作者
看串口通信程序,似乎进入中断前程序处于LPM3模式休眠,所以后面有退出的语句,
但是定时中断里没有,不太明白。
另外程序是用的哪个时钟?
如果使用的是内部时钟,那么这个时钟不是很准,
和事先预想的会有差别,是否速度慢下来是它的原因?

使用特权

评论回复
13
supernan| | 2013-7-23 20:11 | 只看该作者
1. 时钟看起来慢与2秒中断肯定无关

使用特权

评论回复
14
supernan| | 2013-7-23 20:12 | 只看该作者
2. 应该是gprs中断频率高、中断服务时间长,相对而言主程序就没时间执行了,看起来显得慢。

使用特权

评论回复
15
栩栩如生| | 2013-7-23 20:14 | 只看该作者
楼主的代码应该不会影响系统的时钟。

楼主说的系统时钟慢了的判断依据是什么呢?

使用特权

评论回复
16
zwll| | 2013-7-23 20:14 | 只看该作者
1.与timerA的2秒中断是应该是无关的。
2.串口与GPRS通信只需要9600波特率,不要太高(GPRS模块的波特率,用AT+IPR=9600;设置AT&W保存),MSP430F149用LXFT1低频晶振32.768K做时钟源,UART的寄存器里选择ACLK
3.注意在UART中断里加上 内部时钟DCO激活。

使用特权

评论回复
17
renyaq|  楼主 | 2013-7-23 20:15 | 只看该作者
我用的是外部的晶振,之所以感觉慢是因为在UART0向GPRS送数据,紧接着UART1向串口调式软件发刚送GPRS的数据,一段时间后发现串口调式软件里的数据速度降下来,怀颖中断嵌套造成的。

使用特权

评论回复
18
renyaq|  楼主 | 2013-7-23 20:15 | 只看该作者
栩栩如生 发表于 2013-7-23 20:14
楼主的代码应该不会影响系统的时钟。

楼主说的系统时钟慢了的判断依据是什么呢? ...


UART0向GPRS送数据,紧接着UART1向串口调式软件发刚送GPRS的数据,一段时间后发现串口调式软件里的数据速度降下来,怀颖中断嵌套造成的。

使用特权

评论回复
19
houcs| | 2013-7-23 20:18 | 只看该作者
我认为你那样uart0收到数据后,单字节立即转发,转发时还要UART1还要用while判断是否准备好了,这样非常占用时间,而且你的Uart0、Uart1用的的同一个晶振?
测试方法可以这样
1.将uart0、uart1用不同的晶振,比如Uart0用LXFT1,Uart2用XT2;
2.或者将Uart0收到一段数据(而不是一个字节)后,再Uart1转发。
第二种方案,程序如下:
#define MAX_LEN 255
extern uchar UartRecLen0=0;//串口0接收数据的长度。
extern uchar UartRecBuf0[MAX_LEN];//串口0接收数据Buffer
extern uchar Glast_r=0;

#define UART1_FORWARD_QUICK 0
//#define UART1_FORWARD_QUICK 1

void RecVary0() //串口0接受消抖。
{

while(1)
  {
   Glast_r = UartRecLen0;
   Delay_ms(10);  
   if(Glast_r == UartRecLen0) break;   
  }                                 
}

void Uart1Send(uchar *buf1,uchar Len1) //串口1发送
{
uint i;
for(i=0;i<Len1;i++)
{
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  TXBUF1 = buf1[i];
  while((UTCTL1&0x01)==0);
}
}

// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
    while (!(IFG1 & UTXIFG0));               
    UartRecBuf0[UartRecLen0] = RXBUF0;        
    UartRecLen0++;
    if(UartRecLen0>=MAX_LEN) UartRecLen0=0;

#if UART1_FORWARD_QUICK==1 ////这种模式,快速转发串口0的数据(预编译命令,不占用程序时间。)
    RecVary0(); //如果Uart0还有数据还在继续,就一直等在这里,当然这里是ms级的,不会太久。
    Uart1Send(UartRecLen0,UartRecLen0); UartRecLen0=0 //串口1转发串口0数据
#endif
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  _EINT();
  switch( TAIV )
  {
   #if UART1_FORWARD_QUICK==0 //这种模式,每2秒转发串口0的数据
     if(UartRecLen0>0)//退出低功耗模式前,判断串口0长度>0 转发消息。
     {
      RecVary0();
      Uart1Send(UartRecLen0,UartRecLen0);
     }
   #endif
    case  2:  break;                                     // CCR1 not used
    case  4:  break;                                     // CCR2 not used
    case 10:  I++;
      LPM3_EXIT ;                              // 跳出LPM3
                  break;
  }

main()
{
SystemInit();//看门狗、晶振与中断 等等初使化
GPRSInit();//打开GPRS电源,并连接上网络等等
_BIS_SR(LPM3_bits+GIE);//进入低功耗模式

#if UART1_FORWARD_QUICK==0 //这种模式,每2秒转发串口0的数据
if(UartRecLen0>0)//退出低功耗模式后,判断串口0长度>0 转发消息。
{
  RecVary0();
  Uart1Send(UartRecLen0,UartRecLen0);
}
#endif
}

我用MSP430F169,GPRS芯片,AT命令,做过估计与你一样的项目

使用特权

评论回复
20
renyaq|  楼主 | 2013-7-23 20:18 | 只看该作者
现在我也是怀疑
“转发时还要UART1还要用while判断是否准备好了,这样非常占用时间”
所以去掉了UART1转发这一节。大不了串口中不看了。跑几天试试!

有个问题这个消抖是什么意思?
void RecVary0() //串口0接受消抖。
{

while(1)
  {
   Glast_r = UartRecLen0;
   Delay_ms(10);  
   if(Glast_r == UartRecLen0) break;   
  }                                 
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝