利用计算机的两个串行口实现“一机双控”

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一、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.记录集使用完成以后要及时关闭与清除,否则退出程序时将造成任务不能正常结束。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航