TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F6638的串口发送数组数据出现错位

串口发送数组会出现数据错位现象,例如 发送01 02 03  会接收成 03 01 02 ,实验多次都是这样

/*******************************************/
#pragma vector=USCI_A1_VECTOR__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; //无中断
case 2: //接收中断处理
//UCA1TXBUF=UCA1RXBUF; //将接收缓存器中的字符传送给发送缓冲寄存器,发送给PC
for(char i=0;i<3;i++)
{
// while (!(UCA1IFG&UCRXIFG));//等待完成发送
ad[i]=UCA1RXBUF;
while (!(UCA1IFG&UCRXIFG));//等待完成接收

}

for(char k=0;k<3;k++)
{
UCA1TXBUF=ad[k];
while (!(UCA1IFG&UCTXIFG));//等待完成发送

}
break;
case 4:break; //发送中断不处理
default:break; //其他情况无操作
}
}

Susan Yang:

建议您中断程序里尽量不要用while 循环,只缓存数据。当达到您所标志的条件如 检测到特定字符或者到一定数量之后,标志一个flag,然后根据这个flag 在主程序里处理 buff的数据,这样不易造成数据丢失。

您现在的波特率是多少?是否有进入低功耗模式LPM?是否有可能是唤醒后起始位判断错误造成的?

请您测试一下其他波特率以及其他的低功耗模式,谢谢

user6045233:

回复 Susan Yang:

我在中断程序里只留ad[i]=UCA1RXBUF这个接收缓存,然后发送缓存UCA1TXBUF=ad[k];放到主函数中去,得到的结果是发送接收到的数组就不会发生错位,但是我看到官方例程里面也有while (!(UCA1IFG&UCTXIFG));这句等待判断在里面啊 ,应该跟有没有while 循环没有关系吧 ,我现在波特率9600,没有设置低功耗。但为什么会出现错位现象,我还没有找到原因,猜想是发送程序占用接收程序的时间了。

灰小子:

回复 user6045233:

楼主你好。你是多久给单片机发送一次数据?

可以根据波特率计算出接收并发送出去需要的大概时间,然后一步一步仿真,看下代码的执行时间,看是否满足要求

user6045233:

回复 灰小子:

我没有设置发送时间

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F6638的串口发送数组数据出现错位
分享到: 更多 (0)