串口接收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条回答
wt9405
1楼-- · 2019-03-24 05:49
发送数据用串口调试工具看没问题。但接收从串口调试工具发来的数据,就会丢个别字节。
qwerghf
2楼-- · 2019-03-24 09:44
 精彩回答 2  元偷偷看……
曹伟1993
3楼-- · 2019-03-24 15:24
这个得看你的通信定义了,如果接收端就达不到这么高的接受速率,丢数据是多正常的事呀,所以看看你接收端的通讯定义,别在程序上浪费时间,因为这些都是很简单的东西,应该不会错的
chunyang
4楼-- · 2019-03-24 20:04
如果没有误码,说明是你的程序问题,接收相关程序的占用时间过长了。
如果同时有误码,说明硬件问题的可能性大,比如波特率误差、信噪比不足等。
现场总线
5楼-- · 2019-03-24 23:36
 精彩回答 2  元偷偷看……
狮子歌歌
6楼-- · 2019-03-25 00:52
UCA1BR0 = 4;                             // 115200
  UCA1BR1 = 0x00;
  UCA1MCTLW |= UCOS16 | UCBRF_5 | 0x5500;
这个配置没问题吗?

一周热门 更多>

相关问题

    相关文章