如何利用动态库接收水下无线通信模块块的数据 40zhuogirllz

VB中通信 mscomm问题
20zhuogirllz]
编辑:www.fx114.net
本篇文章主要介绍了"VB中通信 mscomm问题
20zhuogirllz]",主要涉及到VB中通信 mscomm问题
20zhuogirllz]方面的内容,对于VB中通信 mscomm问题
20zhuogirllz]感兴趣的同学可以参考一下。
下位机发送指令:0X23&OX03&OX00&OX51&校验和
上位机判断指令正确后,向下位机发送:
OX21&OXxx(xx表示后面的字节长度)&0X00&0X51&当前值(四字节)&校验和
谁能告诉我上位机的代码该怎样写&&?有点茫然&&&Option&Explicit
&&&&Dim&strData&As&String&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Private&Sub&send()
&&&&Dim&i&As&Integer
&&&&Dim&sendSj(4)&As&Byte
&&&&sendSj(0)&=&&H21
&&&&sendSj(1)&=&&H3
&&&&sendSj(2)&=&&H0
&&&&sendSj(3)&=&&H51
&&&&sendSj(4)&=&(sendSj(0)&+&sendSj(1)&+&sendSj(2)&+&sendSj(3))&Mod&256
&&&&MSComm1.Output&=&sendSj
Private&Sub&Form_Load()
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&If&Mid(strData,&1,&2)&=&"23"&And&Len(strData)&=&10&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&send
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&End&If
&&&&End&Select
End&SubPrivate&Sub&MSComm1_OnComm()
Static&M&As&Integer
Static&SP&As&Integer
Static&DataRecieve(1023)&As&Byte&'String&'Variant&'
Static&DatAddr&As&String
Dim&TempData1&As&Long
Dim&TempData2&As&Long&&&''''''''''''''
Dim&DataBus&As&Variant
Dim&i&As&Integer,&j&As&Integer
Dim&n&As&Integer,&temp2&As&Integer
Dim&Check&As&Long
Dim&CheckCode&As&Byte&&&&&&&'和校验码
Dim&rs&As&ADODB.Recordset
Dim&tempStr&As&String,&tempStr1&As&String,&cmdC&As&String
Dim&content&As&Long
Dim&comExit&As&Boolean
Select&Case&mEvent
&&&Case&comEventBreak&&&&&&'&收到&Break。
&&&Case&comEventCDTO&&&&&&&'&CD&(RLSD)&超时。
&&&Case&comEventCTSTO&&&&&&'&CTS&Timeout。
&&&Case&comEventDSRTO&&&&&&'&DSR&Timeout。
&&&Case&comEventFrame&&&&&&'&Framing&Error
&&&Case&comEventOverrun&&&&'&数据丢失。
&&&Case&comEventRxOver&&&&&'&接收缓冲区溢出。
&&&Case&comEventTxFull&&&&&'&传输缓冲区已满。
&&&Case&comEventDCB&&&&&&&&'&获取&DCB&时意外错误事件
&&&Case&comEvCD&&&&&&&&&&&&'&CD&线状态变化。
&&&Case&comEvCTS&&&&&&&&&&&'&CTS&线状态变化。
&&&Case&comEvDSR&&&&&&&&&&&'&DSR&线状态变化。
&&&Case&comEvRing&&&&&&&&&&'&Ring&Indicator&变化。
&&&Case&comEvReceive&&&&&&&'&收到&Rthreshold&个字符。
&&&&&&n&=&MSComm1.InBufferCount
&&&&&&M&=&M&+&n
&&&&&&MSComm1.InputLen&=&1
&&&&&&For&i&=&M&-&n&To&M&-&1
&&&&&&&&&DataBus&=&MSComm1.Input
&&&&&&&&&DataRecieve(i)&=&DataBus(0)
&&&&&&&&&If&DataRecieve(i)&=&Asc(":")&Then
&&&&&&&&&&&SP&=&i&'判断数据头
&&&&&&&&&End&If
&&&&&&Next&i
&&&Case&comEvSend&&&&&&&&&&'&传输缓冲区有&Sthreshold&个字符
&&&Case&comEvEOF&&&&&&&&&&&'&输入数据流中发现&EOF&字符
End&Select
If&M&&=&11&Then&'''m&??&start&if1
&&&If&Chr(DataRecieve(M&-&2))&=&vbCr&And&Chr(DataRecieve(M&-&1))&=&vbLf&Then&'CR&and&Lf&&&判断数据尾
&&&&&&For&i&=&SP&+&1&To&M&-&5&Step&2&
&&&&&&&Check&=&Check&+&Val("&H"&&&Chr(DataRecieve(i))&&&Chr(DataRecieve(i&+&1)))
&&&&&&Next&i
&&&&&&Check&=&Check&Mod&256
&&&&&&Check&=&256&-&Check
&&&&&&If&Check&=&256&Then
&&&&&&&&&Check&=&0
&&&&&&End&If
&&&&&&CheckCode&=&Val("&H"&&&Chr(DataRecieve(M&-&4))&&&Chr(DataRecieve(M&-&3)))'和校验
&&&&&&If&Check&=&CheckCode&Then&&&''start&if3
&&&&&&&&&For&i&=&SP&+&1&To&M&-&5'判断是否每个字符都为0~F
&&&&&&&&&&&&If&DataRecieve(i)&&&48&Or&(DataRecieve(i)&&&57&And&DataRecieve(i)&&&65)&Or&DataRecieve(i)&&&70&Then
&&&&&&&&&&&&&&&comExit&=&True
&&&&&&&&&&&&&&&Exit&For
&&&&&&&&&&&&End&If
&&&&&&&&&Next
&&&&&&&&&If&comExit&Then
&&&&&&&&&&&&comExit&=&False
&&&&&&&&&&&&SendingMessage&(message)
&&&&&&&&&&&&Monitor_cnt&=&0
&&&&&&&&&&&&M&=&0
&&&&&&&&&&&&Exit&Sub
&&&&&&&&&End&If
上面的基于modbus通讯的部分程序,其中返回的都为可见的asc字符,思想都是一样的,楼主自己看看吧回复:zdingyun
&&我想实现上位机向下位机发送:&当前值从文本框中获取
OX21&OXxx(xx表示后面的字节长度)&0X00&0X51&当前值(四字节)&校验和Option&Explicit
&&&&Dim&strData&As&String
Private&Sub&send()
&&&&Dim&i&As&Integer
&&&&Dim&sendSj(4)&As&Byte
&&&&sendSj(0)&=&&H21
&&&&sendSj(1)&=&&H3
&&&&sendSj(2)&=&"&H"&&&Mid(Text2,&1,&2)
&&&&sendSj(3)&=&"&H"&&&Mid(Text2,&3,&2)
&&&&sendSj(4)&=&(sendSj(0)&+&sendSj(1)&+&sendSj(2)&+&sendSj(3))&Mod&256
&&&&MSComm1.Output&=&sendSj
Private&Sub&Form_Load()
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
&&&&Text2&=&"0051"
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&If&Mid(strData,&1,&2)&=&"23"&And&Len(strData)&=&10&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&send
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub'Option&Explicit
&&&&Dim&strData&As&String
'模拟下位机向上位机发送的数据
Private&Sub&send_click()
&&&&Dim&i&As&Integer
&&&&Dim&sendSj(4)&As&Byte
&&&&sendSj(0)&=&&H21
&&&&sendSj(1)&=&&H3
&&&&sendSj(2)&=&&H0
&&&&sendSj(3)&=&&H51
&&&&sendSj(4)&=&(sendSj(0)&+&sendSj(1)&+&sendSj(2)&+&sendSj(3))&Mod&256
&&&&MSComm1.Output&=&sendSj
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&send()&&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和,如果正确,则上位机需要向下位机发送命令:21&XX(表示后面的字节长度07或者08)&00&51&当前值(四个字节)&校验和
&&&&&&&&&&&&If&(buffer(0)&+&buffer(1)&+&buffer(2)&+&buffer(3))&=&buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send&(1)=
&&&&&&&&&&&&&&&&send(2)&=&&H0
&&&&&&&&&&&&&&&&send(3)&=&&H51
&&&&&&&&&&&&&&&&send(4)=
&&&&&&&&&&&&&&&&send(5)=
&&&&&&&&&&&&&&&&send(6)=
&&&&&&&&&&&&&&&&send(7)=
&&&&&&&&&&&&&&&&send(8)=
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub上面是我自己写的&&&不知应该怎样完成&&请zdingyun大侠帮忙指导&&谢谢Option&Explicit
&&&&Dim&strData&As&String
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&send(4)&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和,如果正确,则上位机需要向下位机发送命令:21&XX(表示后面的字节长度07或者08)&00&51&当前值(四个字节)&校验和
&&&&&&&&&&&&If&(buffer(0)&+&buffer(1)&+&buffer(2)&+&buffer(3))&Mod&256&=&buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send(1)&=&&H3
&&&&&&&&&&&&&&&&send(2)&=&&H0
&&&&&&&&&&&&&&&&send(3)&=&&H51
&&&&&&&&&&&&&&&&send(4)&=&(send(0)&+&send(1)&+&send(2)&+&send(3))&Mod&256
&&&&&&&&&&&&&&&&'send(5)=
&&&&&&&&&&&&&&&&'send(6)=
&&&&&&&&&&&&&&&&'send(7)=
&&&&&&&&&&&&&&&&'send(8)=
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub我可能没有表达清楚我想发送的数据格式。
&&&&&&&固定位+长度位+&&固定位&+&&数据位+&&&校验位
&&&&&&&&21&&&&&XX&&&&00&51&&&(四个字节)&&&XX数据位需要从文本框中读取&&。。。要求用四个字节的十六进制数表示&&,而文本框中输入时应该是十进制的数据。这是我写的程序,请大侠指点
&&&&Dim&strData&As&String
'模拟下位机向上位机发送的数据
Private&Sub&send_click()
&&&&Dim&i&As&Integer
&&&&Dim&sendSj(4)&As&Byte
&&&&sendSj(0)&=&&H21
&&&&sendSj(1)&=&&H3
&&&&sendSj(2)&=&&H0
&&&&sendSj(3)&=&&H51
&&&&sendSj(4)&=&(sendSj(0)&+&sendSj(1)&+&sendSj(2)&+&sendSj(3))&Mod&256
&&&&MSComm1.Output&=&sendSj
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&send()&&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和,如果正确,则上位机需要向下位机发送命令:21&XX(表示后面的字节长度07或者08)&00&51&当前值(四个字节)&校验和
&&&&&&&&&&&&If&Hex((buffer(0)&+&buffer(1)&+&buffer(2)&+&buffer(3))&Mod&256)&=&buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send&(1)=&??&&'长度该怎样判断,因为后面的校验和位数有可能是一字节,也可能是两个字节
&&&&&&&&&&&&&&&&send(2)&=&&H0
&&&&&&&&&&&&&&&&send(3)&=&&H51
&&&&&&&&&&&&&&&&send(4)&=&"&h"&&&Mid(Label2.Caption,&1,&2)
&&&&&&&&&&&&&&&&send(5)&=&"&h"&&&Mid(Label2.Caption,&3,&2)
&&&&&&&&&&&&&&&&send(6)&=&"&h"&&&Mid(Label2.Caption,&5,&2)
&&&&&&&&&&&&&&&&send(7)&=&"&h"&&&Mid(Label2.Caption,&7,&2)
&&&&&&&&&&&&&&&&send(8)=&??'校验和是前面的数之和,又和数据长度的值有关
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&End&If
&&&&End&Select
'将文本框中的十进制数转换为十六进制数(四个字节)
Private&Sub&Text2_Change()
&&&Dim&i&As&Integer
&&&Dim&j&As&Integer
&&&Label2.Caption&=&Hex(Val(Text2.Text))
&&&If&Len(Label2.Caption)&&&8&Then
&&&&&&j&=&8&-&Len(Label2.Caption)
&&&&&&For&i&=&1&To&j
&&&&&&&&&&Label2.Caption&=&"0"&&&Label2.Caption
&&&&&&Next&i
End&SubPrivate&Function&GetCheckSum(a()&As&Byte,&ByVal&iBegin&As&Long,&ByVal&iEnd&As&Long)&As&Long
&&&&Dim&l&As&Long
&&&&Dim&i&As&Long
&&&&For&i&=&iBegin&To&iEnd
&&&&&&&&l&=&l&+&a(i)
&&&&GetCheckSum&=&l
End&Function
Private&Sub&MSComm1_OnComm()
&&&&Dim&buffer()&As&Byte
&&&&Dim&send()&As&Byte
&&&&Dim&l&As&Long
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&comEvReceive
&&&&&&&&&&&&buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(buffer)
&&&&&&&&&&&&&&&&strData&=&strData&&&Right$("0"&&&Hex(buffer(i)),&2)
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&If&Hex(GetCheckSum(buffer,&0,&3)&Mod&256)&=&buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&&ReDim&send(8)
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send(1)&=&7&&&&'先按校验和1字节计算
&&&&&&&&&&&&&&&&send(2)&=&&H0
&&&&&&&&&&&&&&&&send(3)&=&&H51
&&&&&&&&&&&&&&&&send(4)&=&"&h"&&&Mid(Label2.Caption,&1,&2)
&&&&&&&&&&&&&&&&send(5)&=&"&h"&&&Mid(Label2.Caption,&3,&2)
&&&&&&&&&&&&&&&&send(6)&=&"&h"&&&Mid(Label2.Caption,&5,&2)
&&&&&&&&&&&&&&&&send(7)&=&"&h"&&&Mid(Label2.Caption,&7,&2)
&&&&&&&&&&&&&&&&l&=&GetCheckSum(send,&0,&7)
&&&&&&&&&&&&&&&&If&l&&=&255&Then
&&&&&&&&&&&&&&&&&&&&send(8)&=&l
&&&&&&&&&&&&&&&&Else&&&&'校验和最多2字节
&&&&&&&&&&&&&&&&&&&&ReDim&Preserve&send(9)
&&&&&&&&&&&&&&&&&&&&send(1)&=&8
&&&&&&&&&&&&&&&&&&&&l&=&GetCheckSum(send,&0,&7)
&&&&&&&&&&&&&&&&&&&&send(8)&=&l&Mod&256
&&&&&&&&&&&&&&&&&&&&send(9)&=&l&\&256
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&End&If
&&&&End&Select
Private&Sub&Text2_Change()
&&&&Label2.Caption&=&Right$("0000000"&&&Hex(Val(Text2.Text)),&8)
End&Sub谢谢楼上的大侠&&
如果我要模拟下位机给上位机发命令的话,下面的代码可以吗
'模拟下位机向上位机发送的数据
Private&Sub&send_click()
&&&&Dim&i&As&Integer
&&&&Dim&sendSj(4)&As&Byte
&&&&sendSj(0)&=&&H21
&&&&sendSj(1)&=&&H3
&&&&sendSj(2)&=&&H0
&&&&sendSj(3)&=&&H51
&&&&sendSj(4)&=&"&h"&&&Hex((sendSj(0)&+&sendSj(1)&+&sendSj(2)&+&sendSj(3))&Mod&256)
&&&&MSComm1.Output&=&sendSj
由于命令长度是固定的,我是不是需要设置Rthreshold=5,这样是不是就能保证当下位机的命令传送完成后,我再进行发送数据的操作RThreshold&只对接收方起作用,的确应该设为固定的&5,否则数组&buffer&长度始终只有&1,求校验的语句就出错的。
还有更正一下:'直接数值比较才是正确的,加了&Hex&反而是&16&进制字符串和&10&进制字符串比较,始终为&False
If&(GetCheckSum(buffer,&0,&3)&Mod&256)&=&buffer(4)&Then请问:
如果我要发送的命令是这样的:OX21&OXxx(xx表示后面的字节长度)&0X00&0X51&输入的数值(四字节)&校验和
以上的程序正确吗Option&Explicit
&&&&Private&Declare&Sub&CopyMemory&Lib&"kernel32"&Alias&"RtlMoveMemory"&(Destination&As&Any,&Source&As&Any,&ByVal&Length&As&Long)
&&&&Dim&strData&As&String
&&&&Dim&sendSj(3)&As&Byte
&&&&Dim&zhSj(3)&As&Byte
Private&Sub&LongToBin()&'将Text2内输入的数据转换为4字节&Byte数据
&&&&Dim&sj&As&Long&'可定义为Single数据类型
&&&&sj&=&Val(Text2)
&&&&CopyMemory&sendSj(0),&sj,&4
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
&&&&Text2&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&Buffer()&As&Byte
&&&&Dim&send(6)&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&Buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(Buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(Buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(Buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(Buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和
&&&&&&&&&&&&If&(Buffer(0)&+&Buffer(1)&+&Buffer(2)&+&Buffer(3))&Mod&256&=&Buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&Call&LongToBin
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send(1)&=&&H5
&&&&&&&&&&&&&&&&send(2)&=&sendSj(3)&'调整高低字节顺序
&&&&&&&&&&&&&&&&send(3)&=&sendSj(2)
&&&&&&&&&&&&&&&&send(4)&=&sendSj(1)
&&&&&&&&&&&&&&&&send(5)&=&sendSj(0)
&&&&&&&&&&&&&&&&send(6)&=&(Val(send(0))&+&Val(send(1))&+&Val(send(2))&+&Val(send(3))&+&Val(send(4))&+&Val(send(5)))&Mod&256
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub帮顶帮顶引用&14&楼&zhuogirllz&的回复:请问:&
如果我要发送的命令是这样的:OX21&OXxx(xx表示后面的字节长度)&0X00&0X51&输入的数值(四字节)&校验和&
以上的程序正确吗
用我&11楼的&GetCheckSum()&求校验和,Byte&类型直接相加存在溢出的可能。
还有你的校验和到底怎么定义的?
按照你&10楼的程序,似乎是不定长的,这按照我&11楼的方式处理。
而按照你&12楼的程序,似乎只要最低字节。大侠再帮帮我:
&&&&如果我从文本框中输入的数据是SINGLE类型(十进制),如何将它转换成十六进制,再将其打包发送给下位机呢??
&&&&谢谢!!Option&Explicit
&&&&Private&Declare&Sub&CopyMemory&Lib&"kernel32"&Alias&"RtlMoveMemory"&(Destination&As&Any,&Source&As&Any,&ByVal&Length&As&Long)
&&&&Dim&strData&As&String
&&&&Dim&sendSj(3)&As&Byte
&&&&Dim&zhSj(3)&As&Byte
Private&Sub&LongToBin()&'将Text2内输入的数据转换为4字节&Byte数据
&&&&Dim&sj&As&Single&'可定义为Long数据类型
&&&&sj&=&Val(Text2)
&&&&CopyMemory&sendSj(0),&sj,&4
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
&&&&Text2&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&Buffer()&As&Byte
&&&&Dim&send(6)&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&Buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(Buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(Buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(Buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(Buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和
&&&&&&&&&&&&If&(Buffer(0)&+&Buffer(1)&+&Buffer(2)&+&Buffer(3))&Mod&256&=&Buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&Call&LongToBin
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send(1)&=&&H5
&&&&&&&&&&&&&&&&send(2)&=&sendSj(3)&'调整高低字节顺序
&&&&&&&&&&&&&&&&send(3)&=&sendSj(2)
&&&&&&&&&&&&&&&&send(4)&=&sendSj(1)
&&&&&&&&&&&&&&&&send(5)&=&sendSj(0)
&&&&&&&&&&&&&&&&send(6)&=&(Val(send(0))&+&Val(send(1))&+&Val(send(2))&+&Val(send(3))&+&Val(send(4))&+&Val(send(5)))&Mod&256
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub下位机的字节序是&big-endian&的?
如果那样的话&2字节的校验和&send(8)、send(9)&应该交换一下。通信协议上是这样说的:下位机不断向上位机发送的命令是:23&XX(表示其后有多少个字节)&00&51&……&校验和(单字节),当上位机判断收到的命令后,对下位机发送的命令格式是:21&XX&00&51&当前值(四字节)&校验和(单字节)。
&&请大侠指点!!通信协议上是这样说的:下位机不断向上位机发送的命令是:23&XX(表示其后有多少个字节)&00&51&……&校验和(单字节),当上位机判断收到的命令后,对下位机发送的命令格式是:21&XX(应该是07,因为后面总共有7个字节)&00&51&当前值(四字节)&校验和(单字节)。&
&&请大侠指点!!这是我的代码,请大侠帮忙看看
Option&Explicit
&&&&Private&Declare&Sub&CopyMemory&Lib&"kernel32"&Alias&"RtlMoveMemory"&(Destination&As&Any,&Source&As&Any,&ByVal&Length&As&Long)
&&&&Dim&strData&As&String
&&&&Dim&sendSj(3)&As&Byte
&&&&Dim&zhSj(3)&As&Byte
Private&Sub&LongToBin()&'将Text2内输入的数据转换为4字节&Byte数据
&&&&Dim&sj&As&Single&'可定义为long数据类型
&&&&sj&=&Val(Text2)
&&&&CopyMemory&sendSj(0),&sj,&4&&&'复制内存的字节数为:4
Private&Sub&Form_Load()
&&&&mPort&=&1
&&&&MSComm1.InputMode&=&comInputModeBinary
&&&&MSComm1.RThreshold&=&1
&&&&MSComm1.PortOpen&=&True
&&&&Text1&=&""
&&&&Text2&=&""
Private&Sub&MSComm1_OnComm()
&&&&Dim&Buffer()&As&Byte
&&&&Dim&send(6)&As&Byte
&&&&Dim&i&As&Integer
&&&&Dim&size&As&Integer
&&&&Dim&ss&As&Integer
&&&&Dim&sum&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&Buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(Buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(Buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(Buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(Buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&'判断校验和
&&&&&&&&&&&&If&Mid(strData,&1,&2)&=&23&And&Mid(strData,&5,&2)&=&0&And&Mid(strData,&7,&2)&=&51&Then
&&&&&&&&&&&&&&&size&=&Val(Mid(strData,&2,&4))
&&&&&&&&&&&&&&&For&i&=&1&To&size
&&&&&&&&&&&&&&&&&&&ss&=&Val(Mid(strData,&i&*&2,&2))
&&&&&&&&&&&&&&&&&&&sum&=&sum&+&ss
&&&&&&&&&&&&&&&Next&i
&&&&&&&&&&&&&&&If&Mid(strData,&size&*&2&+&3,&2)&=&sum&+&Val(23)&Then
&&&&&&&&&&&&&&&
'&&&&&&&&&&&&If&(Buffer(0)&+&Buffer(1)&+&Buffer(2)&+&Buffer(3))&Mod&256&=&Buffer(4)&Then
&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&Call&LongToBin
&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&send(1)&=&&H7
&&&&&&&&&&&&&&&&send(2)&=&&H0
&&&&&&&&&&&&&&&&send(3)&=&&H51
&&&&&&&&&&&&&&&&send(4)&=&sendSj(3)&'调整高低字节顺序
&&&&&&&&&&&&&&&&send(5)&=&sendSj(2)
&&&&&&&&&&&&&&&&send(6)&=&sendSj(1)
&&&&&&&&&&&&&&&&send(7)&=&sendSj(0)
&&&&&&&&&&&&&&&&send(8)&=&(Val(send(0))&+&Val(send(1))&+&Val(send(2))&+&Val(send(3))&+&Val(send(4))&+&Val(send(5))&+&Val(send(6))&+&Val(send(7)))&Mod&256
&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&End&If
&&&&End&Select
End&SubPrivate&Sub&MSComm1_OnComm()
&&&&Dim&Buffer()&As&Byte
&&&&Dim&jyh()&As&Byte
&&&&Dim&send(6)&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&&&Buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(Buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(Buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+&Hex(Buffer(i))
&&&&&&&&&&&&&&&&Else
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&Hex(Buffer(i))
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&Next&i
&&&&&&&&&&&&If&Mid(strData,&1,&2)&=&"23"&And&Len(strData)&=&2&*&(Val("&H"&&&Mid(strData,&3,&2))&+&2)&Then
&&&&&&&&&&&&&&&&ReDim&jyh(Val("&H"&&&Mid(strData,&3,&2))&+&1)
&&&&&&&&&&&&&&&&Dim&j&As&Integer
&&&&&&&&&&&&&&&&For&j&=&1&To&2&*&(Val("&H"&&&Mid(strData,&3,&2))&+&2)&Step&2
&&&&&&&&&&&&&&&&&&&&jyh((j&-&1)&/&2)&=&Val("&H"&&&Mid(strData,&j,&2))
&&&&&&&&&&&&&&&&Next
&&&&&&&&&&&&&&&&'写判断校验和代码
&&&&&&&&&&&&&&&&&&Dim&sum&As&Integer
&&&&&&&&&&&&&&&&For&j&=&0&To&Val("&H"&&&Mid(strData,&3,&2))&'+&1
&&&&&&&&&&&&&&&&&&&&sum&=&sum&+&jyh(j)
&&&&&&&&&&&&&&&&Next
&&&&&&&&&&&&&&&&If&(sum&Mod&256)&=&jyh(Val("&H"&&&Mid(strData,&3,&2))&+&1)&Then
&&&&&&&&&&&&&&&&&&&&Text1.Text&=&strData
&&&&&&&&&&&&&&&&&&&&Call&LongToBin
&&&&&&&&&&&&&&&&&&&&send(0)&=&&H21
&&&&&&&&&&&&&&&&&&&&send(1)&=&&H5
&&&&&&&&&&&&&&&&&&&&send(2)&=&sendSj(3)&'调整高低字节顺序
&&&&&&&&&&&&&&&&&&&&&&&send(3)&=&sendSj(2)
&&&&&&&&&&&&&&&&&&&&send(4)&=&sendSj(1)
&&&&&&&&&&&&&&&&&&&&send(5)&=&sendSj(0)
&&&&&&&&&&&&&&&&&&&&send(6)&=&(Val(send(0))&+&Val(send(1))&+&Val(send(2))&+&Val(send(3))&+&Val(send(4))&+&Val(send(5)))&Mod&256
&&&&&&&&&&&&&&&&&&&&MSComm1.Output&=&send
&&&&&&&&&&&&&&&&&&&&strData&=&""
&&&&&&&&&&&&&&&&End&If
&&&&&&&&&&&&End&If
&&&&End&Select
End&Sub帮顶帮顶引用&25&楼&zdingyun&的回复:VB&codePrivate&Sub&MSComm1_OnComm()
&&&&Dim&Buffer()&As&Byte
&&&&Dim&jyh()&As&Byte
&&&&Dim&send(6)&As&Byte
&&&&Dim&i&As&Integer
&&&&Select&Case&mEvent
&&&&&&&&Case&2
&&&&&&&&&&&&'上位机接收下位机发来的数据
&&&&&&&&&&&&&&Buffer&=&MSComm1.Input
&&&&&&&&&&&&For&i&=&0&To&UBound(Buffer)
&&&&&&&&&&&&&&&&If&Len(Hex(Buffer(i)))&=&1&Then
&&&&&&&&&&&&&&&&&&&&strData&=&strData&&&"0"&+…
LZ:一个好的通信协议可以事半功倍,否则事倍功半.看都看不懂,还是帮顶下。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 无线通信模块梳理 的文章

 

随机推荐