基于VB的PC-单片机通信波特率自动检测方法
一.引言
主从分布式微机系统是控制领域广泛使用的微机系统。主机一般由数据处理能力强、有良好人机界面的PC机担任,分机常以体积小、价格便宜、控制能力强的单片机为核心。
信息量不大的PC机—单片机通信一般采用串行通信方式。在分布式多波特率通信系统中,常常要求从机自身的波特率能随主机设备自动调整以使系统适应性更强、更具智能化。
本文介绍:主机为PC机用VB6.0编程,从机为80C51单片机时,利用微软的Mscomm控件和单片机的定时/记数器实现单片机波特率准确自动检测的方法。
该方法硬件和软件实现容易、简单、实用。
二.MSComm控件简介
微软MSComm控件提供了一系列标准通信属性和方法,具有完善的串口数据的发送和接收功能。该控件具有两种处理方式:(1)事件驱动方式:由 MSComm控件的OnComm事件捕获并处理通信错误及事件;(2)查询方式:通过检查CommEvent属性的值来判断事件和错误。
当设置MSComm控件的Settings属性值为“9600,n,8,1”时表明:PC机串口波特率为9600b/s, 帧格式为:无校验,一个起始位,8个数据位,一个停止位。一帧数据共10位。帧结构如下:
当设置MSComm控件的Settings属性值为“9600,e,8,1”时表明:PC串口波特率为9600b/s, 帧格式为:一个起始位,8个数据位,一个偶校验位,一个停止。一帧数据共11位。帧结构如下:
其中D0~D7是8位数据位,D8是偶校验位。
三.硬件原理框图
四.软件算法思想
通信开始时,主机用一帧十位的格式发一个ASCII码为0的测试字符,则对应的帧结构如下:
单片机循环检测RXD脚,无数据时该脚为高电平,当检测到测试数据起始位时(低电平)启动计数器T0,当检测到停止位时(高电平)停止记数,T0所记数(TH0TL0)为单片机接收一帧数据9位所需的机器数时间。则,单片机波特率为:
波特率=9/(TH0TL0 x 机器周期)
=9/(TH0TL0 x 12 x 振荡周期)
=(9 x 振荡频率)/(TH0TL0 x 12)
五.主机发送ASCII码值为0的字符的源程序
Private Sub Form_Load()
MSComm1.CommPort = 1 ;使用COM1串口
MSComm1.Settings = "9600,n,8,1" ;设置通信格式,见本文一
End Sub
Private Sub Send_Click()
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True ;打开串口COM1
MSComm1.OutBufferCount = 0 ;清0发送缓冲区发送字符数
A =Chr(0) ;ASCII码为0的字符送A
MSComm1.Output = A ;发送
End Sub
说明:若程序中MSComm1.Settings = "9600,e,8,1",则发送的是一帧11位偶校验数据,其中D0~D8均为0。对应单片机检测程序(见下文五)TH0TL0结果值为一帧10位的对应机器数值。
六.单片机接收测试数据,计算接收一帧9位数据所需机器数时间,源程序如下:
ORG 8000H
MOV TMOD,#01H ;T0工作于方式1,GATE=0
MOV TH0,#00H ;清0 TH0TL0
MOV TL0,#00H
RLL1: JB P3.0,RLL1 ;等待RXD脚变低
SETB TR0 ;启动T0
RLL2: JNB P3.0,RLL2 ;等待RXD脚变高
CLR TR0 ;停止T0记数
MOV A,TL0 ;存放一帧9位记数机器数值
MOV A,TH0
......
参考书:
石东海 扈啸 周旭升《单片机数据通信技术从入门到精通》西安电子科技大学出版社 2002
复旦大学微机开发应用研究室《MCS—51微型计算机用户手册》1986
评论