VB的MSCOMM控件用于串口通讯非常方便,在DELPHI中也可引入。
只要在VB设计环境的部件中选择了MicroSoft COMM Control,即可将MSCOMM从控件栏拖入Frame。
所有的设置均可通过该控件属性完成,无需代码。正确的设置除各应用所需的通讯4参数(bps,数据位,效验位,停止位)Settings及通讯端口号CommPort外,还应设置另外两项:InputMode:comInputModeBinary、RThreshold:1。使用2进制输入方式,是因为Text方式相当容易受到干扰而引起通讯长时间堵塞,甚至不能恢复。更改接收阈值=1后,即可使用控件事件OnComm,使程序无需查询端口。其他设置使用控件缺省值即可,一般应用无需更改。
准备完毕后,程序在入口仅需增加MSComm1.PortOpen = True来打开通讯口,既可工作。实用程序中,还应加入错误捕捉检测端口是否存在,以免程序跳出。
由于抗干扰的需要使用了2进制通讯方式,给编程带来一定麻烦,需要使用2进制函数收发数据,剪一段代码如下,代码适用于文本通讯:
接收:
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvCTS: MSComm1.Handshaking = comNone
Case comEvReceive:
aStr = ""
bstr = MSComm1.Input
l = LenB(bstr)
For i = 1 To l
aStr = aStr + Chr$(AscB(MidB(bstr, i, 1)))
Next i
'此时收到aStr字符串,连续拼装后即可找到完整的接收串。
End Select
End Sub
发送:
Public Sub SendaStr(ByVal aStr As String)
Dim aStrB() As Byte
Dim i As Integer
Dim l As Integer
l = Len(aStr) - 1
If MSComm1.PortOpen Then
ReDim aStrB(l) As Byte
For i = 0 To l
aStrB(i) = Asc(Mid(aStr, i + 1, 1))
Next i
MSComm1.Output = aStrB
End If
End Sub
当需要进行2进制通讯时(如MODICOM),不应使用字符串作为收发缓冲,可将2位码值(HEX())存入字符串进出收发函数,以免VB判定\0为字符串结束。
2进制通讯对于00、01之类的控制码均能接收,进程不会卡死,我还尝试收发中文均能成功,但代码较多。
本人使用MSCOMM控件建立多S7 200的数据通讯网络,比买组态并且学习总是在变的规则简单多了。