答案:利用Visual Basic实现二进制串行通信
关键词 面向对象编程,二进制,
笔者在研制一个产品时,需要利用PC机对单片机进行控制,为简化单片机控制程序,节省单片机内存,通信需要采用二进制代码。而对PC机而言,采用面向对象编程工具编程,不但人机界面漂亮,编程效率也要高得多。但大多数Windows 95环境下工作的面向对象编程工具都不支持低级语言编程,而高级编程又不支持二进制操作。经过摸索,笔者利用Visual Basic的MSComm控件和CByte函数成功的解决了这一问题。
一、Visual Basic的MSComm控件的安装
Visual Basic的MSComm控件是一个ActiveX 控件,在Visual Basic的通用控件工具箱中并没有此控件,在使用前用户需要自己安装。安装步骤如下:
1. 在“工程”菜单中,单击“部件”(也可以在工具框中单击鼠标右键)以显示如下图所示的“部件”对话框。该对话框中列出所有可加入的ActiveX 控件。
2. 选定控件名称左边的复选框中的Microsoft Comm Control 5.0。
3. 单击“确定”以关闭“部件”对话框。所选定的MSComm控件将出现在工具框中。该控件用图标表示
二、MSComm 控件的加入和设置
1. 用鼠标单击MSComm 控件图标,并在窗口(Form)的任意位置上拖出此控件。在程序运行时,MSComm 控件并不显示。
2. 建立MSComm 控件与串行端口连接
使用MSComm 控件的第一步是建立与串行端口的连接。即为它确定通信端口号、设置通信参数和握手协议。右击此控件,拉出一个快捷菜单,单击菜单上的属性栏,即出现一个如下图所示的属性设置对话框。
通信端口号根据你所使用的通信口确定,若鼠标器已使用了COM1,则你只能使用COM2。通信参数顺序为波特率、奇偶校验、数据位和停止位。波特率一般可设置到9600,但在一开始可以先设得低一点,例如300,等程序调通后再调高。奇偶校验可设无(N),数据位必须设位8,停止位可设成1位或2位,在波特率较高时,设置2位停止位可提高
通信成功率。
握手协议一般使用缺省值0(comNone),即不使用握手协议。
三、打开串行端口并将它用于二进制通信
1. 打开串行端口
将MSComm控件的PortOpen属性设为True,就可打开串行端口。此语句一般写在窗口(Form)的LOAD事件中:
MSComm1.PortOpen = True
2.将接收和发送缓冲区属性设置为二进制格式
若要以二进制格式接收传入的数据,必须在窗口(Form)的LOAD事件中将MSComm控件的InputMode 属性设置为comInputModeBinary常数,:
MSComm1.InputMode = comInputModeBinary
而要以二进制格式发送数据,则只要将要发送的数据定义为Byte 数组类型,然后用Output 属性被用来向发送缓冲区发出Byte 数组变体型数据:
Dim outbuf(3) As Byte
MSComm1.Output = outbuf
四、二进制数据的接收
在发生通讯事件(如收到数据)或错误时,将触发 OnComm 事件,CommEvent 属性的值将被改变。在收到数据时,CommEvent 属性值为2(comEvReceive)。因此可以在MSComm控件的OnComm 事件中用Input属性将接收缓冲区的数据送到用户缓冲区,当然用户缓冲区也应该定义为Byte 数组类型。但是不能直接将赋值给一个Byte 数组,这样会发生语法错误。必须先将它赋给一个Visual Basic的Variant变量,再将Variant变量赋给一个Byte 数组。
接收缓冲区中字节的数目可从InBufferCount 属性中得到,将该属性的值设置为 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中不能直接处理二进制数据,所以必须把其它格式的常量或变量转换为二进制格式。在Qbasic中,可以用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
上一个:什么是VB?
下一个:vb设计的问题。