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.

关于串口自适应波特率的问题

Other Parts Discussed in Thread: MSP430F5510

各位大侠,你们做过5系列的串口波特率自适应吗?我现在使用的是msp430F5510,单片机与PC机通信,只是从单片机发送给PC主机,但不知道PC端的波特率,所以要做单片机的波特率自适应,5系列都有串口自适应功能,但是不是很清楚怎么实现。在官网上下了一个例程,但它是1系列的,1系列单片不带波特率自适应。它是这样做的

int autobaud(void)

{

  baudrates rate;

while (!(UTCTL0 & TXEPT));                    // Confirm no TXing before setup

  UCTL0 |= SWRST;                               // Place USART in reset

  URCTL0 = URXEIE;                              // Allow erroneous input to interrupt

  UCTL0 &= ~SWRST;                              // Take USART out of reset

 

  setbaud(BAUD115K);

 

  switch (getchar())                            // Get UART character

  {

    case 0x0d :

      rate = BAUD115K;                          // Perfect match!

      break;

    case 0xe6 :

      rate = BAUD57600;

      break;

    case 0x1c :

      rate = BAUD38400;

      break;

    case 0xe0 :

      rate = BAUD19200;

      break;

    case 0x80 :

      rate = BAUD14400;

      break;

    case 0x00 :

      delay_8_33ms();                           // Delay program execution to

                                                // make sure a byte-receiption

                                                // at 1200bps is over

 

      setbaud(BAUD9600);                        // Set new baud rate

 

      switch (getchar())                        // Get 2nd UART character

      {

        case 0x0d :                             // Perfect match!

          rate = BAUD9600;

          break;

        case 0xe6 :

          rate = BAUD4800;

          break;

        case 0x78 :

          rate = BAUD2400;

          break;

        case 0x80 :

          rate = BAUD1200;

          break;

        default :

          return -1;                            // Failure

      }

      break;

    default :

      return -1;                                // Failure

  }

  delay_8_33ms();                               // Delay program execution to

  setbaud(rate);

  showbaud(rate);

  return 0;                                     // success

}

请问在5系列中可以这样做吗?谢谢,附件是例程

slaa215.zip
  • 还有我不明白这个例程中的getchar()得到是字符是PC端自动发的,还是事先规定好的。

  • 有一篇关于波特率自适应的文章。一般涞水getchar是一个事先约定好的。

    automatic baud rate detection.pdf
  • 事先约定好,一定得有两个终端。相当于主从关系。但是我现在只是从单片机msp430F5510发送数据给另一端,这一端的波特率是多少我是不知道的。所以现在做单片机msp430F5510这端的波特率自适应。这样能做到吗??

  • 实现自适应波特率有两种方法.

    1.从机设置在最高波特率的模式, 主机按照自己的波特率发送1-2个事先约定好的字符,从机根据接收到的数据

    来判断主机的实际波特率。这个方法很简单,楼主的代码就是采用的这个方法。

     但这个方法也有一定的局限性,

     其一,它不能真正的实现自适应波特率,只能实现有效的几个波特率检测。

     其二,它不能消除由于不同设备之间的振荡器误差造成的波特率误差,在温度变化引起各个设备之间振荡器误差

                较大时,有可能造成通信不正常。

    2. 软件实现自适应波特率。

     实现这个有用软件来做的,也可以利用MSP430的硬件来做.

     软件来做的思路大概就是:

     1. 从机先设置UART的接收管脚为输入IO

     2. 主机发送0XAA(或0X55)同步字(8-N-0),这样在RX管脚上会出现 0-10101010-1的波形‘

     3. 从机捕获10之间的时钟数(或者第一个10到最后一个10的时钟数),把该数转换成UART的波特率值。

     4. 从机使能IO口为UART模式.

     这样处理的优点是:

     1. 能够有效的消除设备器件带来的误差。即使用误差较大的振荡器也同样能实现UART的通信。

     2. 能够实现更多的波特率,最大波特率取决于捕获的精度.

     缺点是操作麻烦,给软件带来一定难度.

    3. MSP4305系列MCU的UART支持LING模式下的自动波特率检测,这个功能基本上是用硬件实现了2所表述的功能

     检测步骤如下:

     1. 从机设置UCMODEx=11,使能自动波特率检测功能

     2. 主机在发送同步字之前发送连续0的打断信号,

     3. 主机发送0X55的同步字(8-N-0)

     4. 从机检测到同步字之后把检测出来的时间度量转换成波特率控制字,保存在UCAxBR0和UCAxBR1中。

  • 谢谢 Triton Zhang给我详细的解答。按照这种思想要实现波特率自适应,必须得主机的配合是吗?我现在的是没有主机,也就是说不能修改主机。只能靠从机来哦实现自适应,那么这样能实现吗??

  • 请问大神,按照你刚才所说的采用硬件实现波特率自适应的方法,是不是主机在发送有用信息之前,要发送一个同步字(例如0x55)才能是先自适应啊?如果我主机并不能发送同步字,发送过来的直接就是一连串数据,还能实现波特率自适应吗?

  • 这位大哥你好,我现在碰到的问题和你一样,也是主机不能发送同步字,而且不能修改主机。你那个问题解决了吗?如果可以的话,能不能指教一下。