Private Sub Command1_Click() MSComm1.Output = Text1.Text End SubPrivate Sub Form_Load() MSComm1.CommPort = 1 '设置Com1为通信端口 MSComm1.Settings = "14400,E,8,1" '设置通信端口参数 9600赫兹、偶校验、8个数据位、1个停止位.(这里需要进一步说明的是: MSComm1.RThreshold = 1 '设置Input一次从接收缓冲读取字节数为100 '最重要的一个,不要设得太多。 MSComm1.PortOpen = True '打开通信口 Text2.Text = ""End SubPrivate Sub MSComm1_OnComm() Text2.Text = Text2.Text & MSComm1.Input End Sub 这是串口通讯最简单的程序,可以实现通讯了,想要实现其他功能在加代码
谢谢。我会稍后试试的,我这里有一段程序,不知怎么采集不到数据,请高手帮我看看!! Option Explicit Dim pv(0 To 99) As Single Dim sv(0 To 99) As Single Dim mv(0 To 99) As Single Dim t As String Dim i Dim var As Variant Dim rd(9) As Byte Dim x(0 To 7) As Byte Private Sub cmdsend_click() x(0) = 129 x(1) = 129 x(2) = 82 x(3) = 0 x(4) = 0 x(5) = 0 x(6) = 83 x(7) = 0 MSComm1.Output = x Timer2.Enabled = True End Sub Private Sub form_load() Timer2.Interval = 1000 Picture1.Scale (0, 1800)-(99, 0) Picture1.AutoRedraw = True Timer2.Enabled = False MSComm1.CommPort = 1 If MSComm1.PortOpen = False Then MSComm1.Settings = "9600,n,8,2" MSComm1.InputMode = comInputModeBinary MSComm1.RThreshold = 1 MSComm1.InputLen = 1 MSComm1.PortOpen = True End If MSComm1.InBufferCount = 0 cmdsend_click End Sub Private Sub mscomm1_oncomm() Select Case MSComm1.CommEvent Case comEvReceive MSComm1.RThreshold = 0 Do DoEvents Loop Until MSComm1.inbuffercount >= 10 var = MSComm1.Input rd(0) = var(0) var = MSComm1.Input rd(1) = var(0) Text1.Text = (rd(0) + rd(1) * 256) / 10 var = MSComm1.Input rd(2) = var(0) var = MSComm1.Input rd(3) = var(0) Text2.Text = (rd(2) + rd(3) * 256) / 10 var = MSComm1.Input rd(4) = var(0) var = MSComm1.Input rd(5) = var(0) Text3.Text = rd(4) + rd(5) * 256 var = MSComm1.Input rd(6) = var(0) var = MSComm1.Input rd(7) = var(0) var = MSComm1.Input rd(8) = var(0) var = MSComm1.Input rd(9) = var(0) MSComm1.rthreshold = 1 End Select Exit Sub End Sub Private Sub timer2_timer() cmdsend_click Picture1.AutoRedraw = True Picture1.Cls Picture1.ForeColor = &HFF For i = 0 To 98 Picture1.Line (i, pv(i))-(i + 1, pv(i + 1)) Next pv(99) = Val(Trim(Text1.Text)) * 10 For i = 0 To 98 pv(i) = pv(i + 1) Next Picture1.ForeColor = &HFF0000 For i = 0 To 98 Picture1.Line (i, sv(i))-(i + 1, sv(i + 1)) Next sv(99) = Val(Trim(Text2.Text)) * 10 For i = 0 To 98 sv(i) = sv(i + 1) Next Picture1.ForeColor = &HC0000 For i = 0 To 98 Picture1.Line (i, mv(i))-(i + 1, mv(i + 1)) Next mv(99) = Val(Trim(Text3.Text)) * 10 For i = 0 To 98 mv(i) = mv(i + 1) Next End Sub
MSComm1.Output = Text1.Text
End SubPrivate Sub Form_Load() MSComm1.CommPort = 1 '设置Com1为通信端口
MSComm1.Settings = "14400,E,8,1" '设置通信端口参数 9600赫兹、偶校验、8个数据位、1个停止位.(这里需要进一步说明的是:
MSComm1.RThreshold = 1 '设置Input一次从接收缓冲读取字节数为100
'最重要的一个,不要设得太多。
MSComm1.PortOpen = True '打开通信口
Text2.Text = ""End SubPrivate Sub MSComm1_OnComm()
Text2.Text = Text2.Text & MSComm1.Input
End Sub
这是串口通讯最简单的程序,可以实现通讯了,想要实现其他功能在加代码
Option Explicit
Dim pv(0 To 99) As Single
Dim sv(0 To 99) As Single
Dim mv(0 To 99) As Single
Dim t As String
Dim i
Dim var As Variant
Dim rd(9) As Byte
Dim x(0 To 7) As Byte
Private Sub cmdsend_click()
x(0) = 129
x(1) = 129
x(2) = 82
x(3) = 0
x(4) = 0
x(5) = 0
x(6) = 83
x(7) = 0
MSComm1.Output = x
Timer2.Enabled = True
End Sub
Private Sub form_load()
Timer2.Interval = 1000
Picture1.Scale (0, 1800)-(99, 0)
Picture1.AutoRedraw = True
Timer2.Enabled = False
MSComm1.CommPort = 1
If MSComm1.PortOpen = False Then
MSComm1.Settings = "9600,n,8,2"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.InputLen = 1
MSComm1.PortOpen = True
End If
MSComm1.InBufferCount = 0
cmdsend_click
End Sub
Private Sub mscomm1_oncomm()
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
Do
DoEvents
Loop Until MSComm1.inbuffercount >= 10
var = MSComm1.Input
rd(0) = var(0)
var = MSComm1.Input
rd(1) = var(0)
Text1.Text = (rd(0) + rd(1) * 256) / 10
var = MSComm1.Input
rd(2) = var(0)
var = MSComm1.Input
rd(3) = var(0)
Text2.Text = (rd(2) + rd(3) * 256) / 10
var = MSComm1.Input
rd(4) = var(0)
var = MSComm1.Input
rd(5) = var(0)
Text3.Text = rd(4) + rd(5) * 256
var = MSComm1.Input
rd(6) = var(0)
var = MSComm1.Input
rd(7) = var(0)
var = MSComm1.Input
rd(8) = var(0)
var = MSComm1.Input
rd(9) = var(0)
MSComm1.rthreshold = 1
End Select
Exit Sub
End Sub
Private Sub timer2_timer()
cmdsend_click
Picture1.AutoRedraw = True
Picture1.Cls
Picture1.ForeColor = &HFF
For i = 0 To 98
Picture1.Line (i, pv(i))-(i + 1, pv(i + 1))
Next
pv(99) = Val(Trim(Text1.Text)) * 10
For i = 0 To 98
pv(i) = pv(i + 1)
Next
Picture1.ForeColor = &HFF0000
For i = 0 To 98
Picture1.Line (i, sv(i))-(i + 1, sv(i + 1))
Next
sv(99) = Val(Trim(Text2.Text)) * 10
For i = 0 To 98
sv(i) = sv(i + 1)
Next
Picture1.ForeColor = &HC0000
For i = 0 To 98
Picture1.Line (i, mv(i))-(i + 1, mv(i + 1))
Next
mv(99) = Val(Trim(Text3.Text)) * 10
For i = 0 To 98
mv(i) = mv(i + 1)
Next
End Sub
8AH 8AH
4.15H为仪表型号的特征:
V5.0-V6.0版仪表开始,15H将逐步用于表示仪表的型号特征,这样从上位机软件就能实现对下位机仪表的自动识别。为了尽量与旧有仪表保持兼容,特作以下约定:
(1)虽然AI系列仪表允许设置很低的通讯波特率,但1200及以下波特率的使用基本上没有,对于AI-708/808型仪表,15H仍返回波特率,这样其高位字节数通常应大于或等于5,当在软件中识别 15H高字节大于5时,上位机软件可识别为AI-708/808型仪表。
(2)对于AI-708/808P型仪表,15H仍返回程序控制字,其高位字节数值为0,低位字节数据如下:
(X)(X)(X)(X)(EV2)(EV1)(HOLD)(STOP)
前4位( BIT)目前暂不用,程序中应允许起为任意值。
HOLD 及STOP=0,则程序运行。
STOP=0,HOLD=1则程序暂停,
STOP=1,HOLD=1,则程序停止
EV1,EV2表示事件输出状态,为1时表示事件输出动作,为0时表示事件输出无效。
(3)AI-708H./Y型仪表,15H的高字节为1低字节备用,应允许其为任意值。
(4)AI-708M型仪表,15H的高字节为3低字节备用,应允许其为任意值。
读/写指令分别如下:
读: 地址代号+52H(82)+要读参数的代号+0+0+CRC校验码
写: 地址代号+43H(67)+要写参数的代号+写入数低字节+写入数高字节+CRC校验码
读指令的CRC校验码为:要读参数的代号*256+82+ADDR
ADDR为仪表地址参数值,范围是0-100(注意不要加上80H)。CRC为以上数做二进制16位整数加法后得到的余数(溢出部分不处理),余数为2个字节,其低字节在前,高字节在后。
写指令的CRC校验码则为:要写的参数代号*256+67+要写的参数值+ADDR。
要写得参数值用16位二进制整数表示。
无论是读还是写,仪表都返回以下数据
测量值PV+给定值SV+输出值MV及报警状态+所读/写参数值+CRC校验码
其中PV、SV及所读参数值均为整数格式,各占2个字节,MV占一个字节,数值范
围0-220,报警状态占一个字节,CRC校验码占2个字节,共10个字节。
CRC校验码为PV+SV+(报警状态*256+MV)+参数值+ADDR,按整数加法相加后得到的余数。
每2个8位数据代表一个16位整形数,低位字节在前,高位字节在后,各温度值采用补码表示,热电偶或热电阻输入时其单位都是0.1℃,1—5V或0—5V等线性输入时,单位都是线性最小单位。因为传递的是16位二进制数,所以无法表示小数点,要求用户在上位机处理。
输出值和报警状态各占1个字节,报警状态采用二进制代码表示各报警信号,如下:
位0 为0则上限报警(HIAL)不成立,为1为上限报警成立。
位1 为0则下限报警(LoAL)不成立,为1为下限报警成立。
位2 为0则正偏差报警(dHAL)不成立,为1为正偏差报警成立。