在串行异步通信中,常常希望从机端的波特率能随主机端的不同设置进行自动调整,这在分布式多种波特率通信系统中可省去波特率硬件设置开关切换的不便。
软件实现波特率自动检测的设计思想常见的有以下两种:一种是当主机启动通信程序以后,逐一选择波特率向从机发某一固定调试字符(如ASCIIa),不断地重复接收和检验过程直至无误;另一种是利用串行异步设计标准中文件导引区和记录字符中停止位的逻辑1信号,采用软件定时的方法确定出解调参数,然后,以该参数为基准,与随后采样的数据位信号中的周期值相比较,以判别出数据位信号中的逻辑1或0,并将其还原成二进制数,以完成整个解调进程。
本节介绍另一种简单、可靠的软件实现波特率自动检测的方法,并给出了程序清单及详尽的注解。该软件方法提高了波特率解调的简捷性和兼容性。
编程方法
通信开始时,从串行口RxD输入一个引导字符(如ASCIIa)作为测试字符。当检测到起始位(下降沿)时,启动计数器TO。在随后串行数据的每一个上升沿,“捕获”计数值并保存。当计数溢出时,最后的“捕获”值则表示串行接收字符从起始位到停止位的持续计数值。然后,将此计数值与波特率索引表中每种标准波特率所对应的数据相比较,从而检测出正确的波特率。
对每一种波特率,通过下式计算出所对应的最大计数器预置值,存入表格BdTab中。
式中:晶振频率的单位为MHz。
以8-N-1通信(8位数据位,无奇偶校检,1位停止位)为例,上式推导如下:
式中:机器周期= 12/晶振频率;字节时间-9/波特率。