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; //其他情况无操作
}
}

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

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

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

    If a post answers your question, please mark it with the "verify answer" button.

    若是回复解决了您的问题,请点击“是”确认答案。谢谢!

  • 回复 Susan Yang:

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

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

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


    昵称:灰小子

    qq:1358611172

  • 回复 Susan Yang:

    你好 我这出了点问题 我写好了一个用收发数组的程序 然后加了一个对接收数组进行对比if语句 结果不能进行对比 您能帮看一下吗?我看它寄存器的值 在当我输入一个不是与ad[0]一样的值后,结果中断内好像会跳过UCA1RXBUF对ad[0]赋值进行q++

    #include <msp430.h>
    unsigned char ad[13]={0};
    unsigned char rx[13]={0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11};
    char q=0;

    /*******************************************/

    void UART_RS232_Init(void)
    {

    P8SEL|=BIT2+BIT3; //模块功能接口设置,即P8.2与P8.3作为接收口与发射口

    P8DIR|=BIT2+BIT3;

    UCA1CTL1|=UCSWRST; //复位USCI
    UCA1CTL1|=UCSSEL_1; //设置辅助时钟,用于发生特定波特率
    UCA1BR0=0x03; //设置波特率
    UCA1BR1=0x00;
    UCA1MCTL=UCBRS_3+UCBRF_0;//调制器设置
    UCA1CTL1&=~UCSWRST; //完成初始化设置 结束复位
    UCA1IE|=UCRXIE; //使能接收中断
    }

    /*******************************************/
    void main( void )
    {
    WDTCTL = WDTPW + WDTHOLD;

    UART_RS232_Init();//初始化232
    _EINT();

    while(1)
    {

    char k=0;

    if( q>12 )//当数组长度到大于12时进入比较,比较成功后发送接收到的数组
    {

    if(ad[0]==0x11)//比较 这个是比较 加上这个能正常收发数组 但是一加上就出错
    {
    for(char i=0;i<13;i++)
    {

    UCA1TXBUF= ad[k];
    while (!(UCA1IFG&UCTXIFG));//等待完成发送
    k++;

    }
    q=0;
    }

    }
    }

    // while(1);
    }

    /*******************************************/
    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR(void)
    {

    switch(__even_in_range(UCA1IV,4))
    {
    case 0:break; //无中断
    case 2: //接收中断处理
    ad[q]=UCA1RXBUF;
    q++;

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