一、MSComm控件的常用属性和事件 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,它提供了两种处理通信问题的方法:
事件驱动方式:在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将触发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
查询方式:在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
1.MSComm 控件的常用属性
CommPort属性:设置或返回通讯端口号,可以设置为1到16之间的任何值;
Settings属性:以字符串形式设置或返回波特率、奇偶校验、数据位和停止位;
PortOpen属性:设置或返回通讯口的状态以及打开和关闭端口;
InBufferSize和OutBufferSize属性:分别设置接收和发送缓冲区分配的内存数量,单位为字节,缺省值分别为1024byte和512byte;
InputLen属性:确定从接收缓冲区移出的字符数量,当InputLen=0时,一次把接收缓冲区的字符全部移出;
Input属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。
OutPut属性:向发送缓冲区传递待发送的数据。
InBufferCount和OutBufferCount属性:分别确定当前驻留在接收缓冲区等待被取出和发送缓冲区准备发送的字符数量,若设置属性值为0,接收和发送缓冲区的内容将被清除;
InputMode属性:设置接收传入数据的格式,设置为0采用文本形式,设置为1采用二进制格式;
SThreshold属性:保存一个产生发送OnComm事件的界限值;
RThreshold属性:设定当接收几个字符时触发OnComm事件;
2.MSComm控件的事件
MSCOMM控件只使用一个事件OnComm,用属性CommEvent的取值来区分不同的触发时机:
(1)CommEvent=1时:传输缓冲区中的字符个数已少于Sthreshold个。
(2)CommEvent=2时:接收缓冲区中收到Rthreshold个字符,此事件用于编写接收数据的过程。
MSCOMM控件的其它属性值参考相关的资料。
二、程序的实现 1.注册MSComm控件
选择VB主菜单中的Component菜单项,弹出Components窗口,选择Microsoft Comm Control6.0,再按确定按钮即可使用MSComm控件。
2.具体实现
在新建的工程项目窗体中需加入2个MSComm控件,串口号分别设置为COM1和COM2。波特率、奇偶校验、数据位和停止位等串口属性设置"9600,n,8,1"。
下面仅给出初始化及以COM1口为例的部分源码:
Private Sub MDIForm_Load()
Dim aRSet1 As Recordset
gMacCodeSelect = "01"
Set db = New Connection
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;
Persist Security Info=False;Data Source=C:\Program Files
\test\xjl.mdb"
Set aRSet1 = New Recordset
aRSet1.Open "select * FROM T_COMM ORDER BY Mcode",
db, adOpenStatic, adLockOptimistic
If aRSet1("TCode").Value > 0 Then aRSet1.Update
Array("TCODE"), Array(0)
aRSet1.MoveNext
If aRSet1("TCode").Value > 0 Then aRSet1.Update
Array("TCODE"), Array(0)
aRSet1.MoveFirst
aRSet1.Close
set aRSet1=Null
MSComm1.Settings = "9600,n,8,1"'设置串口属性波特率、奇偶校验、数据位和停止位
MSComm2.Settings = "9600,n,8,1"
If Not MSComm1.PortOpen Then '打开串口
MSComm1.PortOpen = True
End If
If Not MSComm2.PortOpen Then '打开串口
MSComm2.PortOpen = True
End If
'清接收缓冲区
MSComm1.InBufferCount = 0
'设一次读入的长度,可根据数据格式设置
MSComm1.InputLen = 28 '设置接收事件触发的阀值
MSComm1.RThreshold = 27
MSComm1.InputMode = comInputModeBinary
MSComm2.InputLen = 28 '设置接收事件触发的阀值
MSComm2.RThreshold = 27
MSComm2.InputMode = comInputModeBinary
End Sub
Private Sub MSComm1_OnComm()
Dim aRSet As Recordset
Dim aRSet1 As Recordset
Dim lV(3) As Double
Dim buffer As Variant
Dim TaskNum as long
Select Case MSComm1.CommEvent
Case comEvReceive
buffer = MSComm1.Input
fRbyteCom1() = buffer
If UBound(fRbyteCom1()) < 27 Then Exit Sub
'数据处理
lV(0) = fRbyteCom1(3)
lV(1) = fRbyteCom1(5) * 256 + fRbyteCom1(4)
lV(2) = fRbyteCom1(7) * 256 + fRbyteCom1(6)
Set aRSet = New Recordset
aRSet.Open "select * from T_comm where Mcode='"
& gMacCodeSelect & "'", db, adOpenStatic, adLockOptimistic
aRSet.Update Array("GCODE", "SHI1", "SHA1"),
Array(lV(0), lV(1), lV(2))
aRSet.MoveFirst
aRSet.Close
'将通信采集的数据写入任务表
Set aRSet = New Recordset
aRSet.Open "select * FROM T_comm WHERE mcode='"
& gMacCodeSelect & "'", db, adOpenStatic, adLockOptimistic
TaskNum= aRSet("TCODE").Value
aRSet.Close
Set aRSet = New Recordset
aRSet.Open "select * FROM T_TASK WHERE CODE="
& TaskNum & " AND GCODE=0 AND TDATE like '"
& gTDate(1) & "%'", db, adOpenStatic, adLockOptimistic
Set aRSet1 = New Recordset
aRSet1.Open "select * FROM T_TASK WHERE CODE="
& TaskNum & " AND TDATE like '" & gTDate(1)
& "%'", db, adOpenStatic, adLockOptimistic
aRSet1.AddNew
aRSet1.Update Array("CODE", "PCODE", "GCODE",
"shi1", "sha1", "tdate", "mcode", "dwdh", "gcmc"),
Array(TaskNum, aRSet("pcode").Value, lV(0),
lV(1), lV(2), gTDate(0), "01", gDhdw(1), gGcmc(1))
aRSet1.MoveFirst
aRSet1.Close
aRSet.Close
set aRSet1=Null
set aRSet=Null
End Select
End Sub
通过OnComm事件接收数据,只有把RThreshold属性设置为大于0才能在接收到字符时产生一个OnComm事件。
三、存在和注意的问题 1.Microsoft Jet引擎使用页面锁定,其锁定的页的大小为2K,在这种锁定方案中,每次将锁定多个记录,锁定的记录的个数取决于每个记录的大小。例如,如果每个记录的长度为230个字节,则每次只能锁定9个记录;而如果记录的长度为30个字节,则每次可锁定68个记录。要特别注意合理设置数据通信表中记录的大小,否则,保存数据时会因页面锁定而造成数据通信不正常。
2.记录集使用完成以后要及时关闭与清除,否则退出程序时将造成任务不能正常结束。
【责编:admin】
--------------------next---------------------