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.

MSP430FR2433: msp430fr2433串口接收异常

Part Number: MSP430FR2433
Other Parts Discussed in Thread: HDC1080

之前检测串口发现1字节接收确实没有问题,现在发现多字节接收怎么有时候会出现错误的字节?例如:PC串口助手发送 96 A5 5A 69给MSP430,发现有时会出现5A变为10的情况出现

  • 能否给出相关代码?另外您使用的是开发板配合串口调试助手来调试?

  • #include "include.h"
    
    #define MAX_STRBUF_SIZE      32 /* 串口接收的最大数据 */
    
    
    unsigned char g_u32RevCnt = 0;  /* 接收字符串自加变量 */
    unsigned char gAr32_u8xString[MAX_STRBUF_SIZE]; /* 串口接收字符串数组 */
    
    
    /*********************************************************************
                          *函数名称:void Init_GPIO( void )
    
                          *函数功能:串口IO初始化
    
                          *入口参数:无
    
                          *出口参数:无
    
                          *备注:无
    *********************************************************************/
    void Init_GPIO( void )
    {
         P2DIR = 0xFF; 
         P2REN = 0xFF; 
         P2OUT = 0x00; 
    }
    
    /*********************************************************************
                          *函数名称:void Transform_Str(unsigned char l_u8Data)
    
                          *函数功能:串口发送单字节函数
    
                          *入口参数:要发送的数据(l_u8Data)
    
                          *出口参数:无
    
                          *备注:无
    *********************************************************************/
    void Transform_Str(unsigned char l_u8Data)
    {
          while(!(UCA1IFG&UCTXIFG));
          UCA1TXBUF = l_u8Data;
    }
    
    /*********************************************************************
                          *函数名称:int putchar(int ch)
    
                          *函数功能:putchar重定义函数
    
                          *入口参数:无
    
                          *出口参数:无
    
                          *备注:无
    *********************************************************************/
    int putchar(int ch)
    {
    	UCA1TXBUF = ch;
    	while(!(UCA1IFG & UCTXIFG));
    	return ch;
    }
    
    /*********************************************************************
                          *函数名称:void Usart_Init( void )
    
                          *函数功能:串口初始化
    
                          *入口参数:无
    
                          *出口参数:无
    
                          *备注:无
    *********************************************************************/
    void Usart_Init( void )
    {
      Init_GPIO();
      PM5CTL0 &= ~LOCKLPM5;                    
    
      FRCTL0 = FRCTLPW | NWAITS_1;
      __bis_SR_register(SCG0);                           // disable FLL
      CSCTL3 |= SELREF__REFOCLK;                         // Set REFO as FLL reference source
      CSCTL0 = 0;                                        // clear DCO and MOD registers
      CSCTL1 &= ~(DCORSEL_7);                            // Clear DCO frequency select bits first
      CSCTL1 |= DCORSEL_5;                               // Set DCO = 16MHz
      CSCTL2 = FLLD_0 + 487;                             // DCOCLKDIV = 16MHz
      __delay_cycles(3);
      __bic_SR_register(SCG0);                           // enable FLL
      while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));         // FLL locked
    
      CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;         // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
                                                         // default DCOCLKDIV as MCLK and SMCLK source
      P2SEL0 |= BIT5 | BIT6;                           
    
      UCA1CTLW0 |= UCSWRST;
      UCA1CTLW0 |= UCSSEL__SMCLK;
    
      // Baud Rate calculation
      // 16000000/(16*9600) = 8.681
      // Fractional portion = 0.681
      // User's Guide Table 14-4: UCBRSx = 0xD6
      // UCBRFx = int ( (8.681-8)*16) = 11
      UCA1BR0 = 8;                             // 16000000/16/115200
      UCA1BR1 = 0x00;
      UCA1MCTLW = 0xD600 | UCOS16 | UCBRF_11;
    
      UCA1CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
      UCA1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
    
      __bis_SR_register(GIE);         //  interrupts enabled
    
    }
    
    
    
    /*********************************************************************
                          *函数名称:void USCI_A1_ISR(void)
    
                          *函数功能:串口接收中断
    
                          *入口参数:无
    
                          *出口参数:无
    
                          *备注:无
    *********************************************************************/
    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR(void)
    {
      switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
      {
        case USCI_NONE: break;
        case USCI_UART_UCRXIFG:     //      接收中断
          while(!(UCA1IFG & UCTXIFG));
            UCA1TXBUF = UCA1RXBUF;
    
        __no_operation();
    
          break;
        case USCI_UART_UCTXIFG: break;
        case USCI_UART_UCSTTIFG: break;
        case USCI_UART_UCTXCPTIFG: break;
        default: break;
      }
    }
    
    

  • 是的 板子是我自己的 串口调试助手负责发送

  • 这是为什么呀? 

  • 我有一个疑问 因为我的工作区内还配置了硬件IIC相关内容,不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?虽然前面我加了寄存器前缀(UCB0IFG&UCRXIFG) / (UCA0IFG&UCRXIFG)   但他们同时工时是会互相影响吗?

  • 单从您现在给出的代码,并没有什么问题。能否给出完整工程,我在开发板上试一下

    不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?

    您现在i2c使用的是eUSCI_B?

  • 1、是的 ,i2c使用的是eUSCI_B。

    2.、我根据之前您发的链接,参考了一下在中断里尽量不写while类型的函数,现象有所缓解,好像没有出错的现象,第一次发指令也能正常读取我HDC1080内的温湿度,但是关于UCB0RXBUF的读取第二次就会出错,我不知道是不是串口与硬件IIC之间的影响。温湿度读取函数,单独拿出来是没有问题的; 

    3.3515.MSP_I2C_TEST.zip

  • 我不知道是不是串口与硬件IIC之间的影响。

    这样的话,建议将串口单独拿出来新建工程来测试

  • 请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空,我发现我规定只接收32字节数据,当发送多余32字节时,发现UCA1RXBUF里剩下的数据还存在,会在下一次发送指令时放在第一位覆盖写入

  • 请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空

    一般来说,BUF每次满了后都会产生中断,用户能读取BUF中的数据。建议尝试下面的方式

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

    中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,置位flag,然后根据这个flag 在主程序里处理 buff的数据。