通讯协议要求是一次发送11个字节的帧给下位机,如果上位机和下位机通讯上了,下位机会返回一个11个字节的帧。
帧的格式:
发送顺序 启始字节 从机地址 主机命令 编码地址 参数值 操作字 设定值 校验数据
数据 3C 1 ~ 31
发送字节数 1 1 1 1 2 2 2 1
定义 帧 头 参数数据 过程数据 帧尾
参数数据(主机命令 编码地址 参数值)
过程数据(操作字 设定值)
例如
范例1:将6号变频器的数字频率(参数P.002)设定为50.00Hz。
主机发送帧: 3C 06 03 02 (88 13)(01 00) (00 00) E3
从机响应帧: 3C 06 01 02 (88 13)(01 00) (00 00) E1 (说明:从机任务正确实现)
3CH是帧 头 06 是从机地址 03是主机命令码 02是参数P.002存储地址 50HZ数据转换50*100=5000=1388H (01 00)都是控制的操作字/状态字 (00 00)是设定植
以下是我写的程序,调试的时候PC机和下位机通讯不上。请各位专家帮忙解决一下问题(急..................)
Option Explicit
Dim code1() As Byte
Dim strData As String
Dim temp1, temp2, temp3, temp4 As String
Private Sub Command10_Click()
ReDim code1(10)
Dim i As Integer
code1(0) = &H3C
code1(1) = "&H" & Text1 '从机地址,16进制
code1(2) = "&H" & Text2
code1(3) = "&H" & Hex(Text3)
code1(4) = "&H" & temp1
code1(5) = "&H" & temp2
code1(6) = Text5.Text
code1(7) = Text6.Text
code1(8) = "&H" & temp3
code1(9) = "&H" & temp4
code1(10) = (Val(code1(0)) + Val(code1(1)) + Val(code1(2)) + Val(code1(3)) + Val(code1(4)) + _
Val(code1(5)) + Val(code1(6)) + Val(code1(7)) + Val(code1(8)) + Val(code1(9))) Mod 256
MSComm1.Output = code1
End Sub
Private Sub Form_Load()
Dim port As Integer
port = 6
MSComm1.CommPort = port 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 11 '产生MSComm事件
MSComm1.PortOpen = True
Text1 = "06"
Text2 = "03"
Text3 = "02"
temp1 = "88"
temp2 = "13"
Text5 = "01"
Text6 = "00"
temp3 = "00"
temp4 = "00"
End SubPrivate Sub MSComm1_OnComm() '接收数据
Dim strBuff As String
Dim BytReceived() As Byte
Select Case MSComm1.CommEvent
Case 1
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
If Mid(strData, 1, 2) = "3C" And Len(strData) = 22 Then
'数据处理代码
Text9 = strData
strData = ""
End If
End Select
End Sub
帧的格式:
发送顺序 启始字节 从机地址 主机命令 编码地址 参数值 操作字 设定值 校验数据
数据 3C 1 ~ 31
发送字节数 1 1 1 1 2 2 2 1
定义 帧 头 参数数据 过程数据 帧尾
参数数据(主机命令 编码地址 参数值)
过程数据(操作字 设定值)
例如
范例1:将6号变频器的数字频率(参数P.002)设定为50.00Hz。
主机发送帧: 3C 06 03 02 (88 13)(01 00) (00 00) E3
从机响应帧: 3C 06 01 02 (88 13)(01 00) (00 00) E1 (说明:从机任务正确实现)
3CH是帧 头 06 是从机地址 03是主机命令码 02是参数P.002存储地址 50HZ数据转换50*100=5000=1388H (01 00)都是控制的操作字/状态字 (00 00)是设定植
以下是我写的程序,调试的时候PC机和下位机通讯不上。请各位专家帮忙解决一下问题(急..................)
Option Explicit
Dim code1() As Byte
Dim strData As String
Dim temp1, temp2, temp3, temp4 As String
Private Sub Command10_Click()
ReDim code1(10)
Dim i As Integer
code1(0) = &H3C
code1(1) = "&H" & Text1 '从机地址,16进制
code1(2) = "&H" & Text2
code1(3) = "&H" & Hex(Text3)
code1(4) = "&H" & temp1
code1(5) = "&H" & temp2
code1(6) = Text5.Text
code1(7) = Text6.Text
code1(8) = "&H" & temp3
code1(9) = "&H" & temp4
code1(10) = (Val(code1(0)) + Val(code1(1)) + Val(code1(2)) + Val(code1(3)) + Val(code1(4)) + _
Val(code1(5)) + Val(code1(6)) + Val(code1(7)) + Val(code1(8)) + Val(code1(9))) Mod 256
MSComm1.Output = code1
End Sub
Private Sub Form_Load()
Dim port As Integer
port = 6
MSComm1.CommPort = port 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 11 '产生MSComm事件
MSComm1.PortOpen = True
Text1 = "06"
Text2 = "03"
Text3 = "02"
temp1 = "88"
temp2 = "13"
Text5 = "01"
Text6 = "00"
temp3 = "00"
temp4 = "00"
End SubPrivate Sub MSComm1_OnComm() '接收数据
Dim strBuff As String
Dim BytReceived() As Byte
Select Case MSComm1.CommEvent
Case 1
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
If Mid(strData, 1, 2) = "3C" And Len(strData) = 22 Then
'数据处理代码
Text9 = strData
strData = ""
End If
End Select
End Sub
解决方案 »
- VB 如何 把多个sql语句结果一次性返回?
- 编写软件调试之后、交付之前,是不是应该到处加上onerror resume next?
- 请教For Each fldEach In rsfill.Fields这个句子的用法
- 我想写一个自动浏览论坛的vb程序,哪位高手赐教一下相关技术,最好有源码
- evb
- 为什么会在显示窗口的时候提示内存溢出呢?
- 怎么做个一天才触发一次的程序
- 重装win2000后,原来可运行的数据工程在运行实老说找不到工程库火死了
- 单击页面时报错 程序中断
- 关于toolbar上的按钮图片交换,急!!!
- 实时错误'3705' 打开对像时,不允许操作
- VB串口通讯如何一次发送11个字节的帧
Private Sub MSComm1_OnComm() '接收数据
Dim strBuff As String
Dim BytReceived() As Byte
Select Case MSComm1.CommEvent
Case 1
'MSComm1.InputLen = 0 '把这句话注释
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
If Mid(strData, 1, 2) = "3C" And Len(strData) = 22 Then
'数据处理代码
Text9 = strData
strData = ""
End If
End Select
End Sub
Dim strBuff As Variant '*
Dim BytReceived() As Byte
Dim i As Integer Select Case MSComm1.CommEvent
Case comEvReceive '2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived = strBuff
For i = 0 To UBound(BytReceived)
strData = strData & IIf(strData = "", "", " ") & Right("0" & Hex(BytReceived(i)), 2)
Next
'数据处理代码
Text9 = strData
strData = ""
End Select
End Sub
InputLen = 0 不成问题,是将提取的字符数设为缓冲区的全部。
终于发出去了
还有在发送新数据 Mscomm1.output之前要最好加 MSComm1.InBufferCount = 0 '清空接受缓冲区
返回码: BF BF 77 FF BF
我认为是下位机那边的串口程序本身存在问题。是不是这样?
看看这个参数和协议是否一样用调试软件连续发送,看下传回来的数据确认下 3C 06 03 02 88 13 01 00 00 00 E3 这串数据是否有误
也就这些了
顺序:BF BF 77 FF BF
BF BF 77 FF BF
BF BF 77 FF BF
BF BF 77 FF BF
BF BF 77 FF BF
FD BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
BF BF 77 FF BD
这是什么问题呢?
看看这个参数和协议是一样 的
空格去掉,试验下,
你代码中处理接受数据的时候,是将其连成字符串
确认下传回来的数据是传byte还是传 string??
没有设置返回码是什么形式的选项