我想应该用
dim char as string
dim s() as bytex = Len(instring)
redim s(x-12)
for i=0 to x-12
s(i)=val("&H" & Mid(instring, 12, i))
nextchar=strconv(s,vbUnicode)
dim char as string
dim s() as bytex = Len(instring)
redim s(x-12)
for i=0 to x-12
s(i)=val("&H" & Mid(instring, 12, i))
nextchar=strconv(s,vbUnicode)
你必须先把“测”也就是6d4b取出来,然后将它们转化成十进制
“测”的十进制为27979,然后用word=CHRW("27979"),这样word就等于“测”了,明白吗,就是必须4位 4位的取出来转换成二进制
所以你首先必须定义一个数组用来保存取出来的4位,然后将它们全部转换成二进制,再用循环将它们一一转换回来,就可以得到你所要的中文字了
转化关系
27979=11+4*16+13*256+6*256*16
b为11,d为13
说到这里,你可以用个CASE 语句
比如 case "a"
num=10
case "b"
num=11
..........
将它们全部转换成十进制在用算法
呵呵明白了吗?
希望大家帮忙解决呀,我的MSComm1.InputMode = comInputModeText,我应该怎么转换呀?
这些都需要通过编写算法来实现,我上面只是用“测”
来举个列子而已
那有这么简单的
我自己编写这些算法花了我3天的时间
我不知道在你那里为什么接不到,
在我这里是能够收到正确的中文的
你需要完成如下的算法:
1:将传送过来的16进制,每4位用一个字符串数组存储
2:将4位16进制里面的含有"A","B",.....这些字符用十进制表示
3:之后,比如这4位为"xyzv"(已经转换为十进制后的数),转换函数为
totoal=x*16*16*16+y*16*16+z*16+v
4:用CHRW(“TOTOAL”)就可以得到中文了
注意:这上面的算法里面有些可能需要用到另外一些小函数,自己再好好编一下这些算法
我在机子上这样写的一特小段测试代码 测试成功
Dim total As Long
Dim str1 As String, str2 As String
str1 = "6d4b"
total = 6 * 256 * 16 + 13 * 256 + 4 * 16 + 11
str2 = total
str1 = ChrW$(total)
Text1.Text = str1
运行后text1.text 上面就是中文 “测”字
多谢了
直接发送即把中文字符等同于英文字符。如:MSComm1.Intput= " 这是一行中文数据!" ,但这种方法发送的中文数据不能太长,发送缓冲区和接收缓冲区的大小需设定为中文字符的两倍以上,而且发送与接收系统所处的操作系统版本最好要一致,否则会出现接收或发送缓冲区溢出之类的错误。这种方法时用于一般要求不太高的场合。
(2)间接发送
在发送端将汉字或字符转换为机器内码或区位码数据数组,然后将咏转换后的数据发送到串口,在接收端接收到数据后,按照相反的顺序得到的数据转换为相应的汉字或字符,在转换过程中.要用到位运算,如取得汉字的内码后需要将高字节和低字节分开,VB6.0中并没有提供此类函数,以下是求整数高、低字订的函数。
Public Function HiByte(a As Integer )
Dim b
b= a And &HFF00
b = b / 256
If b<0 Then b = b + 256
HiByte = b
End FunctionPublic Function LowByte(a As Integ`er)
Dim b
b = a And &HFF
LowByte = b
End Function
不是 6d4b8b45
而是 6d4b8bd5
传错了吧 Dim strResult As String
Dim strOrigin As String
strOrigin = "6d4b8bd5"
Do While Len(strOrigin) > 0
strResult = strResult & ChrW(CLng("&H" & Left(strOrigin, 4)))
strOrigin = Right(strOrigin, Len(strOrigin) - 4)
Loop
MsgBox strResult
下面是我按照你的程序编的程序:
'下面的程序,只是简单的只取发送过来的中文内容
'其他的只是把取的字符串变成你所要取的就行
'首先你得确定计算机收到的就是这个串,我这里没有这种发信息的工具
'所以只能手工设置它了。
instring = "aa0331333931303734323331346d4b8bd5"Dim byte1() As String
Dim byte2() As Long
Dim sum1() As Long
Dim len1 As Integer, len2 As Integer
Dim str1 As String
Dim word As String
Dim gsmnumber As String
len1 = Len(instring)
word = Trim(Mid(instring, 27, len1 - 26)) '取6d4b8b45
len2 = Len(word)
ReDim byte1(len2) As String
For i = 1 To len2
byte1(i - 1) = Mid(word, i, 1)
byte1(i - 1) = UCase(byte1(i - 1)) '字母全部转换成大写
Next i
'将数组转换成十进制
ReDim byte2(len2) As Long
For i = 1 To len2
Select Case byte1(i - 1)
Case "A"
byte2(i - 1) = 10
Case "B"
byte2(i - 1) = 11
Case "C"
byte2(i - 1) = 12
Case "D"
byte2(i - 1) = 13
Case "E"
byte2(i - 1) = 14
Case "F"
byte2(i - 1) = 15
Case Else
byte2(i - 1) = Val(byte1(i - 1))
End Select
Next i
'取一个UNCODE码字母的十进制总和,4个数组元素代表一个字
len1 = Int(len2 / 4) 'len2肯定是4的倍数
ReDim sum1(len1) As Long
For i = 1 To len2 Step 4
j = j + 1
sum1(j - 1) = byte2(i - 1) * 16 * 16 * 16 + byte2(i) * 16 * 16 + byte2(i + 1) * 16 + byte2(i + 2)
n = sum1(0)
m = sum1(1)
Next i
'显示字符串
For i = 1 To len1
str1 = str1 & ChrW(sum1(i - 1))
Next i
'在text里显示出来
Text1.Text = str1
我运行后text1.text正确显示"测试“两个字
我临时编的,可能有些别的小BUG
但是我运行后是成功的
对方是直接发unicode码过来的吗
你直接设置,mscomm.inputmode=comInputModeBinary
串口接受的不就是二进制吗还有你下次 回答完问题的时候,
单击一下下面的“将帖子提前”
要不我看不到
可以吗
然后
MSComm1.RThreshold = 1
设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
既然你是这样设置的那么
你收到的“测试"应该是以二进制传输过来的
那你就设置成buffer=buffer & mscomm1.input
这样过来的就是二进制字符串了
现在必须把它转换成16进制
转换规则就是,每次从这个字符串中选取四位 比如 1101
换成1个16进制数就可以了
二进制转换成16进制应该会吧,
大学一年级就应该会的,呵呵
如果传输过来的是二进制,那就没有必要变成16进制
直接将二进制转变成十进制,在CHR()不就成功了吗
二进制转换成十进制的算法跟上面我给你的差不多了
就是用mid函数取四个二进制位,存储在byte(i)里面
然后
比如四位二进制位为1101存储在byte(0),byte(1)...转化成10进制
则total=byte(0)*2*2*2+byte(1)*2*2+byte(2)*2+byte(3)
这样就变成十进制了,
接下来,就跟上面一样了,
你自己认真的总结一下吧
做程序必须很认真的思考的
mscomm1.inputmode=cominputmodebinary
如果我接受的方式是:buffer=buffer&mscomm1.input,其中buffer应该是设置为变量还是字符串呢,buffer最后是否是“对方发送信息的二进制”呢
我这里对方发送的格式是固定的,就是帧头+控制字节+信息,帧头是AAH,控制字节是03H,信息是手机号码+短消息内容,其中手机号码是ASC码,短消息内容是UNICODE码,这些都是固定的
如果buffer最后是接收信息的二进制字符串,那我该怎么转换为16进制的呢,我想转换为16进制来处理,我可以用i=len(buffer)来知道buffer的长度吗?
我现在都糊涂了,大概是我的基础太差了呀
谢谢你对我的帮助
谢谢
你必须自己转换成数组
dim byte() as byte
再用mid取位
能告诉应该怎么处理呢?
谢谢
比如传输的是:d6b4659885dded65 十六进制
Private Sub Command1_Click()
Dim Buffer as Variant
Dim Arr() as Byte'设定并打开端口
MSComm1.CommPort = 1
MSComm1.PortOpen = True'设定 InputMode 读取二进制数据
MSComm1.InputMode = comInputModeBinary'等待直到输入缓冲区有 8 个字节
Do Until MSComm1.InBufferCount < 8
DoEvents
Loop'往缓冲区存二进制数据
Buffer = MSComm1.Input'赋值于字节数组以便处理
Arr = BufferEnd Sub
,Byte 变量存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0 至 255 之间
'arr 是数组首地址,现在这里存放着的是二进制字节
如果这个时候去用VB 看ARR(0)的值你会发觉 它等于214 这就说明它是十进制的,接下来就是将它们一一还原为十进制,也就是我上面跟你说的十进制转化为16进制的(注意高字节和低字节)。
下面就跟上面那些一样的步骤了:
如果还不明白:
那只好请我来帮你做了,呵呵
Private Sub Form_Load()MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvRecieveDim sinn() As String, buffer As Variant, instring, gsmnumber, word, inword As String
Dim i As Long, ii As Long
Dim byte1() As Long
Dim sum1() As Long
Dim byte2() As Byte
End Select
If MSComm1.InBufferCount > 0 Thenbuffer = MSComm1.Input
byte2 = buffer
ReDim byte2(254)`对方最多可以发送255个字节,这是手机限制了的
For i = 0 To 254For ii = 1 To 8 Step 4
word = Mid(byte2(i), ii, 4)
Select Case word
Case "0000"
word = "0"
Case "0001"
word = "1"
Case "0010"
word = "2"
Case "0011"
word = "3"
Case "0100"
word = "4"
Case "0101"
word = "5"
Case "0110"
word = "6"
Case "0111"
word = "7"
Case "1000"
word = "8"
Case "1001"
word = "9"
Case "1010"
word = "A"
Case "1011"
word = "B"
Case "1100"
word = "C"
Case "1101"
word = "D"
Case "1110"
word = "E"
Case "1111"
word = "F"
End Select
instring = instring & word
Next ii
Next i
Text1.Text = instring`我运行程序后,这里显示的全是0,为什么呀
End If
End Sub
我的qq是44756788,我已经加妳为好友了,妳不在
谢谢你的帮忙
我真的搞不懂了
妳帮我解析呀
谢谢!!!!!!!!!!
这一步就不对
比如 ,i=0 :
byte(0)=170 ‘170 是个十进制的数值啊,你怎么能用mid 函数来取呢? 看来你还是不明白我的意思
你知道170 是怎么得来的吗? 170 = a*10+a (其中a =10)
你现在必须把170 重新分开来,变回16进制
再取
byte2()不是个二进制的数组吗?我应该怎么分开这个十进制的数呀
170 = a*10+a (其中a =10)这句话什么意思呀
word = Mid(byte2(i), ii, 4)
你上面的的句子,
i=0
word=mid(170 ,ii,4) 这么写当然是什么都取不到了,
你的text.text当然是怎么都没有了
在VB里面,byte2(0)它直接认为这是170 ,而不是什么二进制串
你必须自己把170变回成16进制 就是 “ aa”
然后再用MID函数
dim str1 as string
for i= lbound(byte2) to ubound(byte2)
str1=str1&hex(byte2(i)
next i
'现在str1 就是一个16进制的字符串了,而且就是你刚开始发过来的一样
现在再用mid 函数,。。
我去过杭州,在人民玻璃厂,妳知道吗?西湖真的好漂亮呀,真羡慕妳在个好地方呀,我以前一直搞plc,工业控制的,我刚开始学习vb,我下午再好好的想一想,我估计我快弄明白了呀,谢谢你了,有不懂的我会问你的,呵呵,妳这个徒弟很笨呀,呵呵
Private Sub Form_Load()MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1
End Sub
Private Sub MSComm1_OnComm()Dim sinn() As String, buffer As Variant, instring, gsmnumber, word, inword As String, start, pausetime As Variant
Dim i, ii As Long
Dim byte1() As String
Dim sum1(), byte3() As Long
Dim byte2() As Byte
Dim len1, len2 As IntegerSelect Case MSComm1.CommEvent
Case comEvRecieve
end select
buffer = MSComm1.Input
byte2 = bufferFor i = LBound(byte2) To UBound(byte2)
instring = instring & Hex(byte2(i))
Next i
Text1.Text = instring `这里不能显示出全部的信息,为什么呀
x = Len(Trim(instring))
gsmnumber = Trim(Mid(instring, 5, 22))
word = Trim(Mid(instring, 23, x))
len2 = Len(word)
ReDim byte1(len2)
For ii = 1 To len2
byte1(ii - 1) = Mid(word, ii, 1)
byte1(ii - 1) = UCase(byte1(ii - 1))
Next ii
ReDim byte3(len2) As Long
For ii = 1 To len2
Select Case byte1(ii - 1)
Case "A"
byte3(ii - 1) = 10
Case "B"
byte3(ii - 1) = 11
Case "C"
byte3(ii - 1) = 12
Case "D"
byte3(ii - 1) = 13
Case "E"
byte3(ii - 1) = 14
Case "F"
byte3(ii - 1) = 15
Case Else
byte3(ii - 1) = Val(byte1(ii - 1))
End Select
Next ii
len1 = Int(len2 / 4)
ReDim sum1(len1)
For ii = 1 To len2 Step 4
j = j + 1
sum1(j - 1) = byte3(ii - 1) * 16 * 16 * 16 + byte3(i) * 16 * 16 + byte3(ii + 1) * 16 + byte3(ii + 2)
Next iiFor ii = i To len1
inword = inword & ChrW(sum1(ii - 1))
Next iiIf Timer > start + pausetime Then
MSComm1.InBufferCount = 0
End IfEnd Sub
这个语句上面
我想在这里应该也得用一个循环,
来将buffer里面的串,存储在byte2数组里面
你应该会VB的逐行调试吧
你试着调试一下上面那些语句
然后把一些值告诉我,或者,你自己就可以找出毛病所在了我今天不在状态,跟我一起来这个烂公司的的一个兄弟辞职走了,心里波动比较大,所以没有什么心情来编程序,你自己好好测试一下吧
我不在杭州,要是杭州我也喜欢,我在温州,烂地方一个。
对了,逐行调试,是按F8吗?我调试的时候,直接就跳过on_comm了,我也不知道怎么了,妳说那个循环该怎么做呀,可以提示我吗?
你先在oncomm事件头,设置一个断点
然后你全部运行程序,也就是按F5,
接下来,你在你的另外一台机子把数据
传输过来,这样,程序就会自动在 oncomm
事件上停止下来,然后你就可以按F8了呵呵,事先申明,我可是凭感觉说的,能不能实现,我就不知道了
相信你自己了,你肯定能够遍出来它的
我现在已经不做这个系统了
我们老板,拿不到固话短消息的协议,所以,我只能停工了
现在必须做另外一个系统,是一个话务台软件,而且是用C++BUILDer做的
所以,以后,我可能不怎么会来这个VB论坛了,
大部分会在CB论坛上,如果以后还能再帮你点什么忙的的话,可以给我发短消息,在这里。