This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于MSP430串口通信UART多字节收发的问题



我使用的是EXP430F5529,我想实现的功能是蓝牙与板子之间的汉字传输控制。

手机通过蓝牙已经可以和430正常通信。但是只能实现1个字节的通信。

一个汉字有3个字节,每次从UCA1RXBUF读取到的都是最后一个字节。

我知道大概的思路是:接收到一个字符,先存储在数组里,依次接收三个。

只是我不知道应该怎么区分每个字符,因为当触发接收中断以后,UCA1RXBUF里面就只有最后一个字节了。

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // 中断向量 0 - 无中断
case 2: // 中断向量 2 - 接收中断
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = UCA1RXBUF;
data_rx = UCA1RXBUF;
break;
case 4:break; // 中断向量 4 - 发送中断
default: break;
}
}

我用的是Code Composer Studio 6.0.0,目前是初学者。

希望有了解的前辈给我详细一点的解答,谢谢啦。

  • 或者你可以设计一个协议,设置一个特定的字符。当下位机接收到这个特定的字符的时候,后续的三个字符就是一个汉字

  • BUF每次满了后都会产生中断,你能读取BUF中的数据。

    如果数据出现覆盖是,是你的程序没有及时响应UART中断。

  • 1 汉字或者英文ASCII对于 UART来说没有区别,所以你说的“UCA1RXBUF里面就只有最后一个字节了“ 这个现象应该是因为之前的传送的字符没有即时取走造成的。

    比如115200 波特率的uart传输,约86us一个字节,如果你整个程序中存在任何执行时间超过86us的中断程序,就会造成UART RX丢数据。

    2 中断程序里尽量不要用while 循环,会造成如上所说的中断执行时间过长的问题。

    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = UCA1RXBUF;

    这一句的最长执行时间就已经接近86us了。。。


    建议:

    case 2: // 中断向量 2 - 接收中断
    rxbuff[ rxcount ] = UCA1RXBUF;
    rxcount ++ ;
    if((  rxcount == 3 ) || (UCA1RXBUF == 0x0D ) )
    {
      rxflag = 1;
    }

    中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,竖一个flag,然后根据这个flag 在主程序里处理 buff的数据。 这样不易造成数据丢失。

    如果你程序中不可避免的有超过86us的中断程序,那么建议用DMA模块,直接将UART RX缓存到内存固定区域。


  • zhifang yang1 说:

    1 汉字或者英文ASCII对于 UART来说没有区别,所以你说的“UCA1RXBUF里面就只有最后一个字节了“ 这个现象应该是因为之前的传送的字符没有即时取走造成的。

    比如115200 波特率的uart传输,约86us一个字节,如果你整个程序中存在任何执行时间超过86us的中断程序,就会造成UART RX丢数据。

    2 中断程序里尽量不要用while 循环,会造成如上所说的中断执行时间过长的问题。

    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = UCA1RXBUF;

    这一句的最长执行时间就已经接近86us了。。。


    建议:

    case 2: // 中断向量 2 - 接收中断
    rxbuff[ rxcount ] = UCA1RXBUF;
    rxcount ++ ;
    if((  rxcount == 3 ) || (UCA1RXBUF == 0x0D ) )
    {
      rxflag = 1;
    }

    中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,竖一个flag,然后根据这个flag 在主程序里处理 buff的数据。 这样不易造成数据丢失。

    如果你程序中不可避免的有超过86us的中断程序,那么建议用DMA模块,直接将UART RX缓存到内存固定区域。


    非常感谢,看了你的答案我的问题已经顺利解决了~

  • 我发现TI自己的UART_READ, 光串口中断的处理时间就花费挺大。。。

    波特率高的话就实时不了了

  • 您好,我也是相同的问题,总共需要接收9组字节数组,但是每次都只能接收最后一个。我的中断程序里面没有while循环,请问这是什么原因呢