通过电脑的串口一次发送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 位是正常的但是觉得程序是有问题的,请求指导