串口发送数组会出现数据错位现象,例如 发送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:
回复 灰小子:
我没有设置发送时间