小白求教vb mscom中 MSComm1.PortOpen=True总出问题

dwnwsuaf 2017-04-21 11:00:37
我的问题是1. 我加上 MSComm1.PortOpen=True 提示窗口已经打开,去掉MSComm1.PortOpen=True,会说端口未打开
我查看了设备管理器,确定是com3口,
2.拿串口调试助手进行调试,发送asc码形式的读指令或者写指令并没有相应的数返回
3.我定义的byte数组存放数据传,但是系统总说我超出下限,我很困扰??

下面是原程序,是想从plc d4寄存器中读取数据,不知道各位大神能不能指点下小弟,在此先谢过了!!感谢!!
' 定义窗体级变量
Dim data(1000) As Single
Dim num As Integer

'初始化:
Private Sub Form_Load()

MSComm1.CommPort = 3
MSComm1.InputMode = 1
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
End Sub

Private Sub Timer1_Timer()

MSComm1.Output = Chr(&H2) & Chr(&H30) & Chr(&H31) & Chr(&H30) & Chr(&H30) & Chr(&H38) & Chr(&H30) & Chr(&H31) & Chr(&H3) & Chr(&H35) & Chr(&H44) 'D4
'MSComm1.Output = Chr(&H2) & Chr(&H30) & Chr(&H31) & Chr(&H30) & Chr(&H30) & Chr(&H43) & Chr(&H30) & Chr(&H31) & Chr(&H3) & Chr(&H36) & Chr(&H38) 'D6
End Sub
'每发送一次指令,触发下面事件,返回数据串
Private Sub MSComm1_OnComm()
Dim Inbyte() As Byte
Dim buffer As String
Dim datastr(20) As String
Dim dataV As Long
ReDim Inbyte(8)
Select Case MSComm1.CommEvent
Case comEvReceive
Inbyte = MSComm1.Input
Text1.Text = Inbyte
Case comEvSend
End Select
datastr(1) = Chr(Inbyte(3))
datastr(2) = Chr(Inbyte(4))
datastr(3) = Chr(Inbyte(1))
datastr(4) = Chr(Inbyte(2))
dataV = Val("&H" & datastr(1)) * (16 ^ 3) + Val("&H" & datastr(2)) * (16 ^ 2) + Val("&H" & datastr(3)) * (16 ^ 1) + Val("&H" & datastr(4)) * (16 ^ 0)
If dataV > 0 Then
Text1.Text = Str(dataV)
End If
End Sub

...全文
1379 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwnwsuaf 2017-04-28
  • 打赏
  • 举报
回复
感谢各位大佬,我的问题已经解决
笨狗先飞 2017-04-22
  • 打赏
  • 举报
回复
串口你运行前是不是被别的软件给占用了,比如你调器没关就去运行程序了
笨狗先飞 2017-04-22
  • 打赏
  • 举报
回复
Inbyte = MSComm1.Input 会把Inbyte数组的大小重置的,就不一定是9字节了 有时数据大,一次comm事件传不完,还要接着收。 ReDim Inbyte(8)没有意义。
zdingyun 2017-04-22
  • 打赏
  • 举报
回复
Option Explicit
    Dim data(1000) As Single
    Dim num As Integer

Private Sub Command1_Click()
    MSComm1.Output = Chr(&H2) & Chr(&H30) & Chr(&H31) & Chr(&H30) & Chr(&H30) & Chr(&H38) & Chr(&H30) & Chr(&H31) & Chr(&H3) & Chr(&H35) & Chr(&H44) 'D4
End Sub

'初始化:
Private Sub Form_Load()
    MSComm1.CommPort = 3
    MSComm1.InputMode = 1
    MSComm1.RThreshold = 1
    MSComm1.SThreshold = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.PortOpen = True
'    MSComm2.CommPort = 5
'    MSComm2.PortOpen = True
End Sub

'每发送一次指令,触发下面事件,返回数据串
Private Sub MsComm1_OnComm()
    Dim Inbyte() As Byte
    Dim i As Long
    Dim buffer As String
    Dim datastr(20) As String
    Dim dataV As Long
    ReDim Inbyte(8)
    Select Case MSComm1.CommEvent
        Case comEvReceive
            Inbyte = MSComm1.Input
'            Text1.Text = Inbyte
        Case comEvSend
    End Select
    For i = 0 To UBound(Inbyte)
        Print Inbyte(i)
        datastr(i) = Chr(Inbyte(i))
    Next
    Text1 = Val("&H" & datastr(3)) * (16 ^ 3) + Val("&H" & datastr(4)) * (16 ^ 2) + Val("&H" & datastr(1)) * (16 ^ 1) + Val("&H" & datastr(2)) * (16 ^ 0)
End Sub
代码OnComm事件代码请按以上修改,不会报错。至于打开COM报错,是其它原因引起。
dwnwsuaf 2017-04-22
  • 打赏
  • 举报
回复
引用 1 楼 bakw 的回复:
串口你运行前是不是被别的软件给占用了,比如你调器没关就去运行程序了
是的是的!,我把串口调试助手上的串口关了就可以了,然后又加了一步 If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作 MSComm1.PortOpen = False 请问您能看看我的第三个问题吗?我的程序一直报下标越界 datastr(1) = Chr(Inbyte(3)) datastr(2) = Chr(Inbyte(4)) datastr(3) = Chr(Inbyte(1)) datastr(4) = Chr(Inbyte(2)) 就是这一块,但是plc传回来的数据传不就应该用一个byte型的数组存储一下再做处理吗? 这样看来不正好对发送读指令02 30 31 30 43 38 30 32 03 37 31 plc回复02 30 30 30 30 03 43 33 存储到inbyte(0)到inbyte(7)中吗 那我这样交换位置应该也不错啊, 您能给我指出问题出在哪里吗?
dwnwsuaf 2017-04-22
  • 打赏
  • 举报
回复
是的是的!,我把串口调试助手上的串口关了就可以了,然后又加了一步 If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作 MSComm1.PortOpen = False 请问您能看看我的第三个问题吗?我的程序一直报下标越界 datastr(1) = Chr(Inbyte(3)) datastr(2) = Chr(Inbyte(4)) datastr(3) = Chr(Inbyte(1)) datastr(4) = Chr(Inbyte(2)) 就是这一块,但是plc传回来的数据传不就应该用一个byte型的数组存储一下再做处理吗? 这样看来不正好对发送读指令02 30 31 30 43 38 30 32 03 37 31 plc回复02 30 30 30 30 03 43 33 存储到inbyte(0)到inbyte(7)中吗 那我这样交换位置应该也不错啊, 您能给我指出问题出在哪里吗?

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧