(周可扬)Visual Basic是微软公司推出的可视化Basic语言编程工具,VB5.0版本增加了对ActiveX的全面支持,编译后文件执行速度比4.0版本提高40%。VB5.0不但可以处理文本、图像、动画、声音等多媒体数据,在数据传输方面也显示了它的强大功能。在产品设计时有时需要利用PC机对单片机进行控制,为简化单片机控制程序,节省单片机内存,通信需要采用二进制代码。而对PC机而言,采用面向对象编程工具编程,不但人机界面漂亮,编程效率也要高得多。大多数Windows 95环境下工作的面向对象编程工具都不支持二进制操作。利用Visual Basic的MSComm控件和CByte函数可以实现PC机和单片机之间的二进制串行通信。
一、Visual Basic的MSComm控件的安装
Visual Basic的MSComm是一个ActiveX控件,在Visual Basic的通用控件工具箱中没有此控件,在使用前需要自己安装。安装步骤如下:
1.在“工程”菜单中,单击“部件”(也可以在工具框中单击鼠标右键)以显示如图1所示的“部件”对话框。该对话框中列出所有可加入的ActiveX控件。

2.选定控件名称Microsoft Comm Control5.0左边的复选框
3.单击“确定”以关闭“部件”对话框。所选定的MSComm控件将出现在工具框中。
二、MSComm控件的加入和设置
1.用鼠标单击MSComm控件图标,并在窗体(Form)的任意位置上拖放此控件(在程序运行时,MSComm控件不显示)。
2.建立MSComm控件与串行端口连接
使用MSComm控件的第一步是建立与串行端口的连接。即为它确定通信参数和握手协议。右击此控件,拉出一个快捷菜单,单击菜单上的属性栏,即出现一个如图2所示的属性设置对话框。

通信端口号根据你所使用的通信口确定,若鼠标器已使用了COM1,则你只能使用COM2。通信参数顺序为波特率、奇偶校验、数据位和停止位。波特率一般可设置到9600,但在一开始可以先设得低一点,例如300,等程序调通后再调高。奇偶校验可设无(N),数据位必须设位8,停止位可设成1位或2位,在波特率较高时,设置2位停止位可提高通信成功率。
握手协议一般使用缺省值0(comNone),即不使用握手协议。
三、打开串行端口并将它用于二进制通信
1.打开串行端口
将MSComm控件的PortOpen属性设为True,就可打开串行端口。此语句一般写在窗体(Form)的LOAD事件中:
MSComm1.PortOper=True
2.将接收和发送缓冲区属性设置为二进制格式
若要以二进制格式接收传入的数据,必须在窗体(Form)的LOAD事件中将MSComm控件的InputMode属性设置为comlnputModeBinary常数:
MSComm1.InputMode=comlnputModeBinary
而要以二进制格式发送数据,则只要将要发送的数据定义为Byte数组类型,然后用Output属性来向发送缓冲区发出Byte数组变体型数据:
Dim outbuf(3)As Byte
MSComm1.Output=outbuf
四、二进制数据的接收
在发生通讯事件(如收到数据)或错误时,将触发Oncomm事件,CommEvent属性的值将被改变。在收到数据时,CommEvent属性值为2(comEvReceive)。因此可以在MSComm控件的OnComm事件中用Input属性将接收缓冲区的数据送到用户缓冲区,当然用户缓冲区也应该定义为Byte数组类型。但是不能直接将缓冲区的数赋值给Eyte数组,这样会发生语法错误。必须先将它赋给一个Variant变量,再将Variant变量赋给Byte数组。
接收缓冲区中字节的数目可从InBjfferCount属性中得到,将该属性的值设置为0,即可清空接收缓冲区。
如果需要获得接收缓冲区的所有内容,就必须将InputLen属性设置为0。这可以在设计时或运行时设置。
具体接收程序如下:
Private Sub MSComm1-OnComm()
Dim st,inbuf(4)As Byte
Dim mysrr As Variant
mysrr=inbuf
If MSComm1.CommEvent=2 Then
If MSComm1.InBufferCount>=4 Then
MSComm1.InputLen=0
mysrr=MSComm1.Input
End If
End If
End Sub
五、将要发送的数据转换成二进制
格式在Visual Basic中不能直接处理二进制数据,所以必须把其它格式的常量或变量转换为二进制格式。可以用CHAR函数来转换,但在Visual Basic5.0中,此函数只能处理小于128的数(标准ASCII码),要处理整个字节(8位),必须使用Cbyte函数,使用方法和CHAR函数相同。
例如下面这段程序发送一组四字节数据,前两个字节为识别码ED4C(16进制数),第三个字节为动作码“A”,最后一个为一个0~255的位置码:
Dim outbuf(3)As Byte
outbuf(0)=CByte(237)
outbuf(1)=CByte(76)
outbuf(2)=CByte(49)
outbuf(3)=CByte(Number)
MSComm1.Output=outbuf