在线情况
楼主
  • 头像
  • 级别
    • 积分7
    • 经验70
    • 文章6
    • 注册2010-07-25
    msp430串口接收字符串的问题
    程序如下:

    #include  <msp430x14x.h>

    #define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
    #define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
    #define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态
    typedef unsigned char uchar;

    unsigned char string[8] ;
     

    void Set_UART1(void);
    void PutString0(uchar *ptr);
    void Send1Char(uchar sendchar);
    void PutString(uchar *ptr);


    /****************主函数****************/
    void main(void)
    {
        unsigned int i;
       
        WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
        P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
        DRE_out;
        RE;
        Set_UART1();
        _EINT();
     
     
        while (1)
        {
         
         if((string[0] == 'A')&&(string[6] == 'a'))  //LET MCU A DO.
         
             {
                 DE;    
                
                 for(i=0;i<3000;i++);
                 PutString0("a12.5522.33e");
                 for(i=0;i<800;i++);
                
                 RE;
                 LPM3;
             
             }
         
          }
         
         
       
    }
    /*******************************************
    函数名称:Set_UART1
    功    能:设置MCU的UART1对应的寄存器
    参    数:无
    返回值  :无
    ********************************************/
    void Set_UART1(void)
    {
        P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
       
        ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
        UCTL1 |= CHAR;                            //选择8-bit字符
        UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
        UBR01 = 0x03;                             //波特率9600
        UBR11 = 0x00;
        UMCTL1 = 0x4a;                            //调整
        UCTL1 &= ~SWRST;                          //初始化UART状态机
        IE2 |= URXIE1 ;            // 中断允许寄存器设置,接收中断允许
       
    }


    //串口接收中断,退出LPM3模式.
    #pragma vector=USART1RX_VECTOR
    __interrupt void usart1_rx (void)
    {
       
        static uchar rxcount = 0;
         LPM3_EXIT;  
         string[rxcount++] = RXBUF1;
         rxcount = rxcount%8; //0~7 loop
         
     
    }
    /*******************************************
    函数名称:Send1Char
    功    能:向PC机发送一个字符
    参    数:sendchar--要发送的字符
    返回值  :无
    ********************************************/
    void Send1Char(uchar sendchar)
    {
          while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空        
          TXBUF1 = sendchar;
       
    }
    /*******************************************
    函数名称:PutSting0
    功    能:向PC机发送字符串,无换行
    参    数:ptr--指向发送字符串的指针
    返回值  :无
    ********************************************/
    void PutString0(uchar *ptr)
    {
          while(*ptr != '\0')
          {
                Send1Char(*ptr++);                     // 发送数据
          }
    }
    要实现的功能是先接收到一个字符串指令放在数组中,只要第0个和第6个字符分别为‘A’和‘a’,则发回一个字符串。。。程序功能没问题,但是每当执行了8次之后就需要再发送6~8次指令才会响应。应该是每发送一次指令,就执行一次发回字符串的功能的,请问出现这样的情况是什么原因?
    [ 此帖最后由DC在2011-1-4 20:35:26从 综合技术专区 转移过来 ]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    你要考虑你的指令要连续发送出来给单片机时,单片机是否能够在极短的时间内响到你连接字节数据。为了确保字节间的有效响应,你要以在发指令时每发一个字节时加适当中延时然后再发下一字节。
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分7
      • 经验70
      • 文章6
      • 注册2010-07-25
      [QUOTE][B]下面引用由[U]DC[/U]发表的内容:[/B]

      你要考虑你的指令要连续发送出来给单片机时,单片机是否能够在极短的时间内响到你连接字节数据。为了确保字节间的有效响应,你要以在发指令时每发一个字节时加适当中延时然后再发下一字节。[/QUOTE]


      我是用串口调试助手发的字符串呀,怎么才能每发一个字节,延时后再发下一字节呢?
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      不懂VC或VB的,找个朋友帮帮忙写个工具...或用串口调试一个一个字符发给MCU...。
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      5
      • 头像
      • 级别
        • 积分7
        • 经验70
        • 文章6
        • 注册2010-07-25
        已解决这个问题
        #pragma vector=USART1RX_VECTOR
        __interrupt void usart1_rx (void)
        {
           static uchar rxcount = 0;
             LPM3_EXIT;
             if(RXBUF1 == 'e')
             {
               RX_flag =1;
               rxcount = 0;  
             }
             else
             {
               string[rxcount++] = RXBUF1;
             }  
        }

        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 6.3286 seconds with 9 queries.