串口接收9600可以,但115200就丢字节是怎么回事?

2019-03-23 22:17发布



MSP430FR6972,时钟用DCO,  8MHZ,串口接收在9600时可以,但115200就丢字节是怎么回事?
示波器看串口信号时间精度并无大的偏差。


void Init_Clock(void)         
{      

    // Startup clock system with max DCO setting ~8MHz
  CSCTL0_H = CSKEY >> 8;                    // Unlock clock registers
  CSCTL1 = DCOFSEL_3 | DCORSEL;             // Set DCO to 8MHz
  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  do
    {
      CSCTL5 &= ~LFXTOFFG;                    // Clear XT1 fault flag
      SFRIFG1 &= ~OFIFG;                      // Clear oscillator fault flag
    }while (SFRIFG1&OFIFG);                  // Test oscillator fault flag  

  CSCTL0_H = 0;                             // Lock CS registers

}


//////////////////////////////////////////
//
//     Configure USCI_A0 for UART mode  
//
//////////////////////////////////////////   
void Init_eUCA0 (void)
{      

  // Configure USCI_A0 for UART mode
  UCA0CTLW0 = UCSWRST;                      // Put eUSCI in reset
  UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK

  UCA1BR0 = 4;                             // 115200
  UCA1BR1 = 0x00;
  UCA1MCTLW |= UCOS16 | UCBRF_5 | 0x5500;

  UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt  
  UCA0IE |= UCTXCPTIE;                      // UART Transmit Complete Interrupt Enable   



}   



///////////////////////////////////////////////
//
//    eUSCI_A0 interrupt service routine
//
///////////////////////////////////////////////

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  unsigned char uc_1;
  switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE:

          break;
    case USCI_UART_UCRXIFG:                    // UCAxRXBUF has received a complete character.

          uc_1 = UCA0RXBUF;
          S1_RXD_Buf[P_S1_R++] = uc_1;           //收到就送缓存

          break;
    case USCI_UART_UCTXIFG:     //UCAxTXBUF empty

          if(P_S1_T<P_S1_T1)
                {
                 UCA1TXBUF = S1_TXD_Buf[P_S1_T++];
                }
          else
                {
                 B_S1_Busy = 0;                //清除发送忙标志
                }
          break;
    case USCI_UART_UCSTTIFG:    //Start bit was received
          break;   
    case USCI_UART_UCTXCPTIFG:  //UCAxTXBUF is empty     
          if(P_S1_T<P_S1_T1)
                {
                 while(!(UCA0IFG&UCTXIFG));
                 UCA0TXBUF = S1_TXD_Buf[P_S1_T++];
                }
          else
                {
                 B_S1_Busy = 0;                //清除发送忙标志
                }     
          break;   
  }
}





此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
现场总线
1楼-- · 2019-03-25 02:45
图片3.png   关于modbus485 232 422 可关注天津三格电子科技有限公司,天津三格电子主做modbus485转光纤近十一年的时间,应用于许多工程,相信天津三格电子会给你一个满意的答复

alan000345
2楼-- · 2019-03-25 08:27
 精彩回答 2  元偷偷看……
tiankai001
3楼-- · 2019-03-25 10:42
看了你的寄存器配置,感觉配置正确。
8M时钟的话,115200的波特率也没啥问题。
丢的字节是一串数据的中间字节,还是最后的字节。除了丢字节,其他数据都正确吗
ienglgge
4楼-- · 2019-03-25 11:47
接收部分的处理,看看有没有耗时比较大的地方。丢数据。能不能找到规律。

一周热门 更多>

相关问题

    相关文章