各位大侠,你们做过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:
这位大哥你好,我现在碰到的问题和你一样,也是主机不能发送同步字,而且不能修改主机。你那个问题解决了吗?如果可以的话,能不能指教一下。
TI中文支持网



