TI中文支持网
TI专业的中文技术问题搜集分享网站

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

各位大侠,你们做过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系列中可以这样做吗?谢谢,附件是例程

anger0925:

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

Peter_Zheng:

回复 anger0925:

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

anger0925:

回复 Peter_Zheng:

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

Triton Zhang:

回复 anger0925:

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

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中。

anger0925:

回复 Triton Zhang:

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

yi hu1:

回复 Triton Zhang:

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

yi hu1:

回复 anger0925:

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

赞(0)
未经允许不得转载:TI中文支持网 » 关于串口自适应波特率的问题
分享到: 更多 (0)