This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于MSP430F149串口发送长数据的问题(假设数据为35位)



通过电脑的串口一次发送20位数据,通过单片机的串口再发送上来,我的程序,现在一次性接收20位是正常的,但多了就不行,请问怎么修改,使一次可以收发多位数据是正常的



#include <msp430x14x.h>

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
#define baud           9600                                //设置波特率的大小
#define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式
#define baud_h         (uchar)(baud_setting>>8)            //提取高位
#define baud_l         (uchar)(baud_setting)               //低位

/*RS485控制管脚*/
#define RS485_CTR1      P5OUT |= BIT2;          //控制线置高,RS485发送状态
#define RS485_CTR0      P5OUT &= ~BIT2;         //控制线置低,RS485接收状态

uchar i,setnum;
#define setnum 25
uchar shuzu[setnum]={0,0,0,0};


//***********************************************************************
//               MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
  P5DIR |= BIT2;                        //P20口为RS485控制口,输出模式
  P5OUT |= BIT2;                        //置高P20
}


//***********************************************************************
//                   系统时钟初始化
//***********************************************************************
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清楚振荡器错误标志
    for(i=0;i<100;i++)
       _NOP();
  }
  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  IFG1&=~OFIFG;
}
//***********************************************************************
//               MSP430内部看门狗初始化
//***********************************************************************
void WDT_Init()
{
   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
}

//*************************************************************************
//               MSP430串口初始化
//*************************************************************************
void UART_Init()
{
  U1CTL|=SWRST + CHAR;                //复位SWRST,8位数据模式
  U1TCTL|=SSEL1;                      //SMCLK为串口时钟
  U1BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
  U1BR0=baud_l;                       //N=UBR+(UxMCTL)/8
  U1MCTL=0x00;                        //微调寄存器为0,波特率9600bps
  ME2|=UTXE1;                         //UART1发送使能
  ME2|=URXE1;                         //UART1接收使能
  U1CTL&=~SWRST;
  IE2|=URXIE1;                        //接收中断使能位
 
  P3SEL|= BIT6 + BIT7;                //设置IO口为第二功能模式,启用UART功能
  P3DIR|= BIT6;                       //设置TXD1口方向为输出
}

//*************************************************************************
//              串口1发送数据函数
//*************************************************************************

void Send_Byte(uchar data)
{
  RS485_CTR1;
  while(!(IFG2&UTXIFG1));             //发送寄存器空的时候发送数据
  U1TXBUF=data;
  //RS485_CTR0;
}

void sendByte_delay(const uchar *pBuffer)
{
     //delay_us(40);
     while((IFG2&UTXIFG1)==0);   //判断是否发送完毕
     U1TXBUF = (*pBuffer);
     //delay_us(40);
}
/******************************************
*函数名称:  sendData
*说明:采用查询方式发送一个字节数据
*******************************************/
void sendData(const uchar * pBuffer,uint n_byte)
{
  uint i;
  RS485_CTR1;
  delay_ms(10);
      for(i=0;i<n_byte;i++)
      {
          sendByte_delay(pBuffer);
          pBuffer++;
      }
   delay_ms(10);
   RS485_CTR0;
}




//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
{
  WDT_Init();                         //看门狗设置
  Clock_Init();                       //系统时钟设置
  Port_Init();                        //端口初始化
  UART_Init();                        //串口设置初始化

  RS485_CTR0;                         //切换到接收状态

  _EINT();                            //开中断
 
  while(1)                            //无限循环
    {
     
    }
}


//*************************************************************************
//               处理来自串口1的接收中断
//*************************************************************************

#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{  
    for(i=0;i<setnum;i++)
  {
    shuzu[i]=U1RXBUF;
    delay_ms(1.1);
  }
  sendData(shuzu,setnum);
  delay_ms(5);                        //切换之前先有个小延时
  RS485_CTR0;                         //切换到接收状态
   
}  
 



20位数据正常  但是25位就不行
 

虽然20 位是正常的但是觉得程序是有问题的,请求指导