5644|5

20

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

大家帮忙看看这个程序?当走到这句时”while((UTCTL0&0x01)==0x00)“就走不动了 [复制链接]

#include

#include


static unsigned char flag = 0;                                       //标志用于延时
static unsigned char j=0;                                          //接收数据的下标
static unsigned char RCV_Byte[100];                                  //用于接收AT指令返回
static unsigned char sign_r=0;                                       // 接收标志
static unsigned char *s;
static unsigned char *ptr;


//检查硬件是否连通

const unsigned char Cmd0[] = "AT\r" ;
const unsigned char SIGN_END[] = "\r";

//定义SIMEMS GPRS指令
const unsigned char GTM900B_Cmd1[] = "AT+CMGF=1\r" ;                        //格式化为文本模式
const unsigned char GTM900B_Cmd2[] = "AT+CSCA=+8613800451500\r";          //设置短信中心号码
const unsigned char GTM900B_Cmd3[] = "AT+CMGS=18745045030\r";              //设置接收手机号码
const unsigned char GTM900B_Cmd4[] = "123 CTRL+Z\r";                                 //发送123
//const unsigned char GTM900B_Cmd5[] = "CTRL+Z\r";                            //发送短信


void XT_Init(void);                          //使用DCO晶体
void Uart0_Init(void);                      //USART0 初始化
void Send_Cmd(const unsigned char *s);
void Clear_Rcv(void);                             //清除接受到的数据
void Delay(unsigned int Num);                     // 精确延时
void Check_Return_OK(unsigned char N1);          //是否返回OK



//主程序
void main(void)
{

  WDTCTL = WDTPW + WDTHOLD;
  XT_Init();
  sign_r=0;
  _EINT();
  Uart0_Init();

  while(1)
  {
    P3DIR|=0x40;
    P3OUT&=~0x40;               
    Delay(3276);               
    P3OUT|=0x40;               
    //Send_Cmd(Cmd0);
    Delay(332768);
    Send_Cmd(GTM900B_Cmd1);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd2);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd3);
    Delay(32768);
    Send_Cmd(GTM900B_Cmd4);
    Delay(32768);
    //Send_Cmd(GTM900B_Cmd5);
    //Delay(32768);

    while(1)
    if(sign_r==1)
      {
        Delay(32768); // 延迟足够长的时间,以接到指令  

       }



  }

}
//精确延时TIMERA中断延时服务程序
#pragma vector = TIMERA0_VECTOR
__interrupt void timera (void)
{

  flag = 1;
  CCTL0 &=~ CCIE;

}

//COM0口接收数据中断服务程序
#pragma vector = USART0RX_VECTOR

__interrupt void uart_rx (void)
{
  RCV_Byte[j] = RXBUF0;
  strstr(RCV_Byte,SIGN_END);
    if(ptr)
      sign_r=1;

     j++;

}

//使用DCO晶震
void XT_Init(void)
{

  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)

}

//USART0初始化
void Uart0_Init(void)
{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  P3DIR |= 0x10;
  ME2 |= UTXE0 + URXE0;                     // Enabled USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initalize USART state machine
  IE2 |= URXIE0;                            // Enabled USART0 RX interrupt

}

//发送指令函数

void Send_Cmd(const unsigned char *s)
{

  while(*s != '\r')
  {
    TXBUF0 = *s;
    while((UTCTL0&0x01)==0x00);
    s++;
  }
  TXBUF0 = '\r';
    while((UTCTL0&0x01)==0x00);

}

//定时器A初始化
void TimerA_Init(void)
{

  TACTL = TASSEL0 + TACLR;

}


//清除接受到的数据
void Clear_Rcv(void)
{
   for(j = 100; j > 0 ; j--)
     RCV_Byte[j-1] = 0;
}

//精确延时
void Delay(unsigned int Num)
{

  CCTL0 |= CCIE;
  CCR0 = Num;
  TACTL |= MC0;
  flag = 0;

}

//是否返回OK
void Check_Return_OK(unsigned char N1)
{

  for(j=0; j<100; j++)

    if((RCV_Byte[j]=='O')&&(RCV_Byte[j+1]=='K'))
    {
      sign_r=1;

    }

}

最新回复

多看资料,多动手,一步步排除遇到的问题  详情 回复 发表于 2013-3-28 12:42

点评

while((UTCTL0&0x01)==0x00) 这句话,条件为真表示什么意思,为假又是什么意思,你知道吗?你查阅了UTCTL0这个寄存器了吗? 你要是什么都没自己动手查一下资料和手册就到处问别人,别人给你说的按资料和手册上的  详情 回复 发表于 2013-3-11 10:16
 
点赞 关注

回复
举报

436

帖子

5

TA的资源

五彩晶圆(初级)

沙发
 
原帖由 今晚的月亮 于 2013-3-10 19:15 发表
#include

#include


static unsigned char flag = 0;                                       //标志用于延时
static unsigned char j=0;                                          //接收数据的下标
st ...

while((UTCTL0&0x01)==0x00)  这句话,条件为真表示什么意思,为假又是什么意思,你知道吗?你查阅了UTCTL0这个寄存器了吗?
你要是什么都没自己动手查一下资料和手册就到处问别人,别人给你说的按资料和手册上的来解释,你到时也听不懂,别人也说得很费力。
有一些东西是别人帮不上忙的,这些部分需要你自己去完成。
 
 

回复

50

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
楼上说得非常好,不要一遇到问题就问人,这样永远不会进步。
虽然很久没用430,但看样子发送死在这句很有可能串口没配置好。
玩MCU这么多年。8051->430->PIC->ARM几乎就没遇到不能解决的问题。
多上官网E2E、Forum,多看apNote,Datasheet吧。
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

4
 


说明正在发送,TXBUF中的数据还没有发出去。

点评

恩,是串口的原因,串口没有配置好,但现在还有个问题,为什么发送数据的长度不同,发送波形的波特率也不同呢?  详情 回复 发表于 2013-3-16 21:52
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 4楼 wstt 的帖子

恩,是串口的原因,串口没有配置好,但现在还有个问题,为什么发送数据的长度不同,发送波形的波特率也不同呢?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

6
 
多看资料,多动手,一步步排除遇到的问题
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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