我认为你那样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命令,做过估计与你一样的项目
下午无聊,交流也是进步,写了我小时啊!
|