社区导航

 

搜索
查看: 589|回复: 10

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

[复制链接]

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-20 15:01: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;   
  }
}







回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-12-20 15:04:12 | 显示全部楼层
发送数据用串口调试工具看没问题。但接收从串口调试工具发来的数据,就会丢个别字节。

点评

程序写的问题,不是硬件问题  详情 回复 发表于 2018-12-20 15:11


回复

使用道具 举报

1061

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-12-20 15:11:58 | 显示全部楼层
wt9405 发表于 2018-12-20 15:04
发送数据用串口调试工具看没问题。但接收从串口调试工具发来的数据,就会丢个别字节。

程序写的问题,不是硬件问题


回复

使用道具 举报

721

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-12-20 15:42:55 | 显示全部楼层
这个得看你的通信定义了,如果接收端就达不到这么高的接受速率,丢数据是多正常的事呀,所以看看你接收端的通讯定义,别在程序上浪费时间,因为这些都是很简单的东西,应该不会错的


回复

使用道具 举报

1万

TA的帖子

146

TA的资源

版主

Rank: 6Rank: 6

技术导师勋章

发表于 2018-12-20 15:59:13 | 显示全部楼层
如果没有误码,说明是你的程序问题,接收相关程序的占用时间过长了。
如果同时有误码,说明硬件问题的可能性大,比如波特率误差、信噪比不足等。
上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-20 19:17:42 | 显示全部楼层
关注天津三格电子,使您走在时代的前段

三格电子产品宣传页.pdf

8.13 MB, 下载次数: 0



回复

使用道具 举报

3

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-20 21:48:18 | 显示全部楼层
UCA1BR0 = 4;                             // 115200
  UCA1BR1 = 0x00;
  UCA1MCTLW |= UCOS16 | UCBRF_5 | 0x5500;
这个配置没问题吗?


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-21 09:03:24 | 显示全部楼层
图片3.png   关于modbus485 232 422 可关注天津三格电子科技有限公司,天津三格电子主做modbus485转光纤近十一年的时间,应用于许多工程,相信天津三格电子会给你一个满意的答复



回复

使用道具 举报

678

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-12-21 10:51:01 | 显示全部楼层
程序问题只能慢慢查啦,哎,不好弄的。


回复

使用道具 举报

7141

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

发表于 2018-12-21 16:33:52 | 显示全部楼层
看了你的寄存器配置,感觉配置正确。
8M时钟的话,115200的波特率也没啥问题。
丢的字节是一串数据的中间字节,还是最后的字节。除了丢字节,其他数据都正确吗


回复

使用道具 举报

3625

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-12-25 14:38:42 | 显示全部楼层
接收部分的处理,看看有没有耗时比较大的地方。丢数据。能不能找到规律。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-20 16:56 , Processed in 0.307523 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表