微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用VB 编程语言实现PC机与AVR 单片机的通信

用VB 编程语言实现PC机与AVR 单片机的通信

时间:12-09 来源:互联网 点击:
0  引 言
在当今,网络技术越来越多地应用在各个领域,微机技术及单片机也不断发展,因此,目前大多数小型计算机监控系统都采用以PC 机和单片机构成的串行通信网络来完成监控任务。其中,单片机主要进行对数据的实时采集、处理,再通过串口将数据送入PC 机的缓冲区,然后由PC 机对数据进行进一步处理,以便得到所需的图形、图像及实验结果。采用VB 语言中的通信控件能够很好地完成二者之间的通信功能。
1  系统简介
本系统是一个小型的人体心电监测系统,将心电信号采出后经过A/ D 转换,由PC 机绘制出心电图形,进行实时显示,便于医护人员观察和诊断,系统原理如图1 所示。系统的下位机即单片机系统,将现场采集的信号经A/ D 转换送入系统上位机。系统上位机由一台PC 机构成,采用Vi2sual Basic 编程,做出友好的界面风格,可实时观察心电信号。
图1  系统原理图
2  MSCOMM 控件功能介绍
VB 提供了一个基本通信控件MSCOMM32.OCX ,它具备串行通信的能力,可以通过串口接收
和传输数据。
CommPort :端口号,用于选择通过哪个端口进行通信。
InBufferCount :返回接收缓冲区中等待的字符数,可以通过置0 来清空缓冲区。
InBufferSize :设置并返回接收缓冲区的字节数。
Settings :设置并返回波特率、奇偶校验、数位、停止位参数。通常设置为:“9 600 , n ,8 ,1”。
PortOpen :设置并返回通讯端口的状态(开或关) 。端口打开后,可以直接读写数据流。
Input :返回并删除接收缓冲区中的数据流。
InputLen :设置并返回Input 属性从接收缓冲区读取的字符数。
InputMode :设置或返回Input 属性取回的数据的类型。
Output :往传输缓冲区写数据流。
3  通信协议
1) 上位机与下位机通信的数据格式均为起始位,命令码,帧长,信息段,校验和,停止位。
起始位与停止位标定一次发送,起始位以前和停止位以后的数据均视为干扰信号。
帧长记录了信息段和校验和总共的字节数。
2) 所有的数据均按ASCII 码(十六进制) 操作。
3) 具体定义如下
信息中的每8 位(1 字节) 作为2 个字符发送。每8 位表示成16 进制数,高4 位、低4 位分
别对应一个ASCII 字符0~9 、A~F。
本协议以“:”(ASCII 值为0X3A) 开始,其次为命令码:8 位、信息段:长度由待发数据而定、校验和:8 位,最后以“回车”或“换行”(ASCII值分别为0X0D、0X0A) 结束。其中,校验和的计算方法为256 - [命令码+信息段长度] mod 256 (mod 表示求余) 。
根据功能不同设置了2 个命令码10 (ASCII值分别为0X31 、0X30) 和11 (ASCII 值分别为0X31 、0X31) 。在起始符后即为命令码,判断该值,以便转向相应的处理程序。
4  软件实现
MSCOMM 控件的使用使得用户不需要对通信底层进行操作,简便而有效。它有事件驱动和查询2 种通信方式,由于本系统只是一个小型的监测系统,因此,采用查询方式即可满足要求。放置一个定时器,参数设定为500 ms ,即每0. 5 s 检测一次缓冲区,将数据读入。

图2  程序流程图
以下是加载窗体时对MSCOMM 控件的初
始化设置
Private Sub Form  Load ()
With MSComm1
. CommPort = 1 ’设置通讯端口
. InBufferCount = 0 ’清空缓冲区
. InBufferSize = 5 000
’设置通讯波特率等
. Settings = “9 600 , n ,8 ,1”
If (PortOpen = False) Then
PortOpen = True
End if’将取出的数据设置为二进制
. InputMode = comInputModeBinary
End With
End Sub
接收按钮按下时,定时器启动,开始检查缓冲区中是否有数据。本系统定义了2 个定时器,一个用于对通讯协议中起始符和命令码的检测,另一个用于控制信息段的数据流。
接收数据时,定义一个变体(Variant) 类型的变量tempbuf ,将缓冲区内的数据赋给此变量tempbuf = MSComm1. Input ,同时还要定义一个字节(Byte) 型的数组变量indate () ,再次赋值indate = tempbuf ,这样就可以操作indate () 中的数据了。
由于Input 属性在取出数据后会自动清空缓冲区,因此不再需要用其他代码强制清空。
为了解决传输干扰的问题,还要求上位机给下位机发送数据,以通知下位机接收的数据是否无误,从而使下位机决定是否重新发送数据。
发送数据时,定义一字符串(St ring) 类型的数组变量outdate ( ) ,将需要发送的数据赋给变量,然后用下面语句发送MSComm1. Output = CVar (outdate)
5  硬件实现
实现电路如图3 所示。
AT90 系列单片机带有一个全双工的通用串行异步收发器(UART) ,数据传送通过把被传送的数据写入UART I/ O寄存器UDR 来初始化,在波特率时钟加载到移位寄存器的传送操作时,起始位从TXD 引脚移出,然后是数据,低位在先。当停止位被移出时UDR 寄存器中没有新的数据,UDRE 标志位将保
持为1 直到UDR 被重写。而在数据接收时,接收器前端的逻辑以16 倍波特率采样RXD 引脚的信号。如果一个有效的起始位被发现,就开始起始位之后的数据位的采样,在采样的同时,这些位被移入传送移位寄存器。当停止位到来时,3 个采样中的大数应为1 才能接收该停止位。
图3  硬件实现电路
6  结束语
本系统试运行已经成功,说明MSCOMM 控件完全可以实现各种高速复杂的串行通信协议,具有很高的实用价值。
参 考 文 献
[1 ]  耿德根,宋建国,马潮. AVR 高速嵌入式单片机原理与应用[M] . 北京:北京航空航天大学出版社,
2001.
[2 ]  东箭工作室. Visual Basic 5. 0 中文版程序设计[M] . 北京:清华大学出版社,1997.InBufferSize :设置并返回接收缓冲区的字节数。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top