使用mscomm控件.
发送数据格式为 !S# & 十六进制 FF & 十六进制 FF & 十六进制 FF & @
中间有三个十六进制的数字,我的写法是
mscomm1.output = chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX)
然后出问题了,十六进制的数字如果超过128,就变成00了.
求助!谢谢大家的帮忙.但是必须是mscomm1.output = chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX)格式的.
我试过用
dim cc(7) as bytes
cc(0)=XX
cc(1)=XX
cc(2)=XX
cc(3)=XX
cc(4)=XX
cc(5)=XX
cc(6)=XX
....
mscomm1.output=cc
这样不行,下位机不理我.
发送数据格式为 !S# & 十六进制 FF & 十六进制 FF & 十六进制 FF & @
中间有三个十六进制的数字,我的写法是
mscomm1.output = chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX)
然后出问题了,十六进制的数字如果超过128,就变成00了.
求助!谢谢大家的帮忙.但是必须是mscomm1.output = chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX) & chr(XX)格式的.
我试过用
dim cc(7) as bytes
cc(0)=XX
cc(1)=XX
cc(2)=XX
cc(3)=XX
cc(4)=XX
cc(5)=XX
cc(6)=XX
....
mscomm1.output=cc
这样不行,下位机不理我.
解决方案 »
- SQL+JOIN如何将两个文件的表连接到一起.
- Image控件1个水平滚动条1个垂直滚动条1个.图片比较大时,如何通过水平滚动条和垂直滚动条控制Image中的图片移动使得未显示出来的部分移动
- DTPicker怎样不显示当前日期?
- 我编的第一个VB程序
- VB5与VB6调用 WIN API的方式一样么?
- 关于控件
- 求救菜单问题
- vb把程序生成exe文件后,不甚丢失程序,能否将exe还原成源程序?????
- asp高手看过来!asp高手看过来!asp高手看过来!
- vb 中 怎么从ADODB.RecordSet 中遍历出 从表中查询到的 信息
- 网页中如何根据控件中传过来的字段查询access数据库,并将相应的信息显示在网页的一个textarea中
- 想要通过自己的程序实现在线翻译,谁能给个建议?谢谢!
Dim sj as String
sj = "!S#"
MsComm1.output = sj
Dim cc(2) as byte
cc(0)=&HFF
cc(1)=&HFF
cc(2)=&HFF
MsComm1.output=cc
sj = "@"
MsComm1.output = sj 或者全部使用Byte数组发送
Dim cc(6) as byte
cc(0)=Asc("!")
cc(1)=Asc("S")
cc(2)=Asc("#")
cc(3) = &HFF
cc(4) = &HFF
cc(5) = &HFF
cc(6) = Asc("@")
MsComm1.output = cc
dim cc(7) as bytes
cc(0)=Int("&H" & XX)
cc(1)=Int("&H" & XX)
cc(2)=Int("&H" & XX)
cc(3)=Int("&H" & XX)
cc(4)=Int("&H" & XX)
cc(5)=Int("&H" & XX)
cc(6)=Int("&H" & XX)
'MSComm1.PortOpen = TrueDim a1, a2, a3 As Integer
Dim st1, st2, st3, st_all As StringReDim matrix(7)
matrix(0) = &H21 '!
matrix(1) = &H31 '1
matrix(2) = &H25 '%
matrix(6) = &H40 '@a1 = Text1.Text \ 65536
If a1 < 15 Then
st1 = "0" & Hex(a1)
Else
st1 = Hex(a1)
End If
matrix(3) = "&H" & st1a2 = (Text1.Text Mod 65536) \ 256
If a2 < 15 Then
st2 = "0" & Hex(a2)
Else
st2 = Hex(a2)
End If
matrix(4) = "&H" & st2a3 = (Text1.Text Mod 65536) Mod 256
If a3 < 15 Then
st3 = "0" & Hex(a3)
Else
st3 = Hex(a3)
End If
matrix(5) = "&H" & st3MDIForm1.MSComm1.OutBufferCount = 0 '清空发送缓冲区
'st_all = Chr(33) & Chr(49) & Chr(37) & Chr(CInt("&H" & st1)) & Chr(CInt("&H" & st2)) & Chr(CInt("&H" & st3)) & Chr(64)
'st_all = Chr(33) & Chr(49) & Chr(37) & Chr(1) & Chr(224) & Chr(244) & Chr(64)MDIForm1.MSComm1.Output = matrix 'st_all
Label8.Caption = MDIForm1.MSComm1.InputEnd Sub这样就是不行.如果是 mscomm1.output="!S%" & chr(0f) & chr(12) & chr(23) & "@"
就无论按多少次都没问题.
但是如果 Chr(XX) 的XX大于 128就变成发送00出去.
问题就是这样,感觉大家帮忙,请继续帮助解答.谢谢.
这句话不知道你是怎么理解的,比如你发字符串"ABC",ABC对应的ASCII是&H41,&H42,&H43.发送的数据实质上和你发送数组byt一样(其中byt(0)=&H41,byt(1)=&H42,byt(2)=&H43)
MDIForm1.MSComm1.Output="ABC"和MDIForm1.MSComm1.Output=byt是一样的
matrix(1) = &H31 '1
matrix(2) = &H25 '%
matrix(3) = &H45
matrix(4) = &H23
matrix(5) = &H56
matrix(6) = &H40 '@ mscomm1.output=matrix
下位机只相应一次,有一个组数的反馈这个里面,我把该数据设置为 45*65536+23*256+56=4531030
但是这个数据只反馈一次.
如果我把写法改成 mscomm1.output= "!1%" & chr(69) & chr(35) & chr(86) & "@"
就没有任何问题,只要发送这个指令就可以获得数据反馈.帮帮我吗,很着急啊
dim cc(256) as byte
for i =0 to 255
cc(i) =i
next 再使用 mscomm1.output= "!1%" & cc(45) & cc(23) & cc(56) & "@" 就有语法错误.怎么办啊?
在 form_load 的时候就已经加上了.
matrix(0) = &H21 '!
matrix(1) = &H31 '1
matrix(2) = &H25 '%
matrix(3) = &H45
matrix(4) = &H23
matrix(5) = &H56
matrix(6) = &H40 '@
matrix(7)= vbcrmscomm1.output=matrix
{
unsigned char b1;
if(RI)
{
RI=0;
b1=SBUF;
com_buff[com_num]=b1;com_num++;
if(com_num==3)
{
if(com_buff[0]==0x21&&com_buff[1]==0x41&&com_buff[2]==0x40) //!A@
{check_flag=1;com_num=0;}
if(com_buff[0]==0x21&&com_buff[1]==0x52&&com_buff[2]==0x40) //!R@
{f_run=1;com_num=0;}
if(com_buff[0]==0x21&&com_buff[1]==0x54&&com_buff[2]==0x40) //!T@
{f_run=0;com_num=0;}
}
if(com_num==7)
{
if(com_buff[0]==0x21&&com_buff[1]==0x31&&com_buff[2]==0x25&&com_buff[6]==0x40)
{f_setime=1;com_num=0;}
}
if(com_num==6)
{
if(com_buff[0]==0x21&&com_buff[1]==0x32&&com_buff[2]==0x25&&com_buff[5]==0x40)
{f_setdisp=1;com_num=0;}
if(com_buff[0]==0x21&&com_buff[1]==0x33&&com_buff[2]==0x25&&com_buff[5]==0x40)
{f_setpower=1;com_num=0;}
}
if(com_num==5)
{
if(com_buff[0]==0x21&&com_buff[1]==0x34&&com_buff[2]==0x25&&com_buff[5]==0x40)
{f_seterr=1;com_num=0;}
if(com_buff[0]==0x21&&com_buff[1]==0x35&&com_buff[2]==0x25&&com_buff[5]==0x40)
{f_setmode=1;com_num=0;}
if(com_buff[0]==0x21&&com_buff[1]==0x36&&com_buff[2]==0x25&&com_buff[5]==0x40)
{f_setcur=1;com_num=0;}
}
}
// if(TI)
// {
// com1_send_byte(0x23);
// TI=0;
// }}这是下位机部分
1)上位机无论按BYTE数组还是以字符发送,如果字节内容是同样的,那么输出端发出的字节(BYTE)流是完全相同的.
2)MSComm控件的InputMode设置仅指设置或返回 Input 属性取回的数据的类型,InputMode 属性确定 Input 属性如何取回数据。数据取回的格式或是字符串或是一数据组的二进制数据的数组。它与发送BYTE数组或字符串无任何关系.
3)从你的叙述看,没有涉及上下位机间的通信协议.请说明通信协议.
4)你贴出的代码处有几点错误,已经修改如下:
Private Sub Command1_Click()
'MSComm1.PortOpen = True
Dim a1, a2, a3 As Integer
Dim st1, st2, st3, st_all As String
ReDim matrix(6) As Byte '未将数组定义为BYTE数组以及下标错误,使的多发1字节
matrix(0) = &H21 '!
matrix(1) = &H31 '1
matrix(2) = &H25 '%
matrix(6) = &H40 '@
a1 = Val(Text1) \ 65536
If a1 < 15 Then
st1 = "0" & Hex(a1)
Else
st1 = Hex(a1)
End If
matrix(3) = "&H" & st1
a2 = (Val(Text1) Mod 65536) \ 256
If a2 < 15 Then
st2 = "0" & Hex(a2)
Else
st2 = Hex(a2)
End If
matrix(4) = "&H" & st2
a3 = (Val(Text1) Mod 65536) Mod 256
If a3 < 15 Then
st3 = "0" & Hex(a3)
Else
st3 = Hex(a3)
End If
matrix(5) = "&H" & st3
MDIForm1.MSComm1.OutBufferCount = 0 '清空发送缓冲区
MDIForm1.MSComm1.Output = matrix
Label8.Caption = MDIForm1.MSComm1.Input
End Sub
是51单片机吧?从这里来看,中断是没什么问题,而且是只收三个byte或者7个或者....就判断,给出标志位.
很明显是数组多发了一位造成的.相信我和楼上的.不相信你就试一下.
Dim a1, a2, a3 As Integer
Dim st1, st2, st3, st_all As String ReDim matrix(6) //如果以前就定义过 matrix() 为byte的话,这里 as 不 as 无所谓了.但是要把下标改一下!必须的!
matrix(0) = &H21 '!
matrix(1) = &H31 '1
matrix(2) = &H25 '%
matrix(6) = &H40 '@ That's All
但是如果还是又人要输入字符串,谁也没办法,所以我感觉使用 Val()也不见得是个什么好办法.
强烈建议 使用 On Error Resume Next 或者 Goto Err之类的.
不至于输入错误就报错退出.
SendingMsg = True
msg = addrStr1 & msg
Dim Out1() As Byte ''msg=轴号+命令+地址+数目
Dim Lrc As Long
Dim a As Integer
Dim L As Integer
L = Len(msg)
Dim i As Integer
Lrc = 0
For i = 0 To L / 2 - 1
a = Val("&H" & Mid(msg, 2 * i + 1, 2))
Lrc = a + Lrc
Next i
Lrc = Lrc Mod 256
Lrc = 256 - Lrc
If Lrc = 256 Then
Lrc = 0
End If
ReDim Out1(L + 4) As Byte
For i = 1 To L
Out1(i) = Asc(Mid(msg, i, 1))
Next i
If Lrc < 16 Then
Out1(L + 1) = Asc(Mid("0" & Hex(Lrc), 1, 1))
Out1(L + 2) = Asc(Mid("0" & Hex(Lrc), 2, 1))
Else
Out1(L + 1) = Asc(Mid(Hex(Lrc), 1, 1))
Out1(L + 2) = Asc(Mid(Hex(Lrc), 2, 1))
End If
Out1(0) = Asc(":")
Out1(L + 3) = &HD ''为结束符
Out1(L + 4) = &HA ''为结束符
If MainWin.MSComm1.PortOpen = True Then
MainWin.MSComm1.OutBufferCount = 0
MainWin.MSComm1.Output = Out1 '
End If
End Sub
上面的程序是我写的基于modbus协议的代码,希望对你有帮助