| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖
标题:winsock通讯 16进制byte 程序问题 数组不能赋值
只看楼主 加入收藏
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
winsock通讯 16进制byte 程序问题 数组不能赋值
程序代码:
Private Sub form_load()

 If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
Winsock1.RemoteHost = "221.130.45.197"
Winsock1.RemotePort = 1001
Winsock1.Protocol = 0 ' TCP 协议
Winsock1.LocalPort = 0
Winsock1.Connect
End Sub

Private Sub Image1_Click()
Dim nobiao(), cs As Byte
Dim no As String
no = "68999999999999680A06" & "Hex(Text1.Text)"
nobiao = no
Dim i As Integer
For i = 0 To 14
cs = cs + nobiao(i)
Next i
nobiao(15) = Hex(cs)
nobiao(16) = &H16
Winsock1.SendData nobiao
End Sub

Private Sub Image2_Click()
Dim data() As Byte
Call set1_data_analy(data())
Winsock1.SendData data
End Sub

Private Sub set1_data_analy(settime() As Byte)
Dim sum As Integer
Dim dt(0 To 9) As String
sum = 14 + Text2.Text + Text3.Text + Text4.Text + Text5.Text + Text6.Text + Text7.Text
While sum >= 256
sum = sum - 256
Wend
While sum < 16
dt(6) = "0" & "Hex(sum)"
Wend

 dt(0) = "Hex(Text7.Text)"

 dt(1) = "Hex(Text6.Text)"

 dt(2) = "Hex(Text5.Text)"

 dt(3) = "Hex(Text4.Text)"

 dt(4) = "Hex(Text3.Text)"

 dt(5) = "Hex(Text2.Text)"

 dt(6) = "Hex(sum)"
Dim a As String
a = "68999999999999680806" & "dt()" & "16"
settime = a
End Sub
图片附件: 游客没有浏览图片的权限,请 登录注册
帧格式是类似这样的
我越改越晕 越改越报错 不知道怎么改才是对的了 麻烦大神们帮我看一下吧~
目前的报错是nobiao=no 这 报错数组不能赋值
搜索更多相关主题的帖子: 通讯 color 
2012-05-29 00:00
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
Dim nobiao(), cs As Byte

nobiao() 的数据类型不是BYTE ,而是 Variant

你需要改为
Dim nobiao()  As Byte , cs As Byte

其次,数组不是使用直接赋值的办法进行赋值。
数组变量内存贮的实际上是一个地址,所以对数据直接赋值是不允许的。
no = "68999999999999680A06" & "Hex(Text1.Text)"
nobiao = no

如果 需要把 6 8 9 9 ... 当成 ASCII 代码直接给 nobiao 的话,可以使用
nobiao  = StrConv( no , vbFromUnicode)
这个函数把 6 翻译成 &H36 也就是 54 放到 nobiao(0) 元素里,
        把 8 翻译成 &H38 也就是 56 放到 nobiao(1) 元素里。
如果不是这样的话,那么你需要自己写翻译函数,然后手动把 数据一个一个的放到 数组的每个元素中去。
或者你按照标准的 桢格式 组合所需要的 ASCII代码,然后再给值。

"dt()" 是引用 dt() 这个字符串,而不是 这个数组。
如果一个是字符串数组,需要把里面的内容连接起来,并且引用,可以使用函数 join
--------------------------------
Join函数     

描述
返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。

语法
Join(list[, delimiter])

Join函数语法有如下几部分:
部分 描述
list 必需的。包含被连接子字符串的一维数组。
delimiter 可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格(" ")来分隔子字符串。如果delimiter是零长度字符串(""),则列表中的所有项目都连接在一起,中间没有分隔符。
--------------------------

授人于鱼,不如授人于渔
早已停用QQ了
2012-05-29 08:29
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
收藏
得分:0 
回复 2楼 风吹过b
好多错...好晕啊...
数组都不能直接赋值么?可是我查到说“为了简化Byte数组和String字符串之间的数据传递,VB允许你在任何动态Byte数组和任何字符串之间直接互相赋值”...

如果 需要把 6 8 9 9 ... 当成 ASCII 代码直接给 nobiao 的话,可以使用
nobiao  = StrConv( no , vbFromUnicode)
这个函数把 6 翻译成 &H36 也就是 54 放到 nobiao(0) 元素里,
        把 8 翻译成 &H38 也就是 56 放到 nobiao(1) 元素里。
如果不是这样的话,那么你需要自己写翻译函数,然后手动把 数据一个一个的放到 数组的每个元素中去。
或者你按照标准的 桢格式 组合所需要的 ASCII代码,然后再给值。

这一段没怎么看懂 我用的帧格式是 68H 99H...两位数是一个字节啊 怎么变成一个是一个字节了?

a = "68999999999999680806" & "dt()" & "16"
如果改成a = "68999999999999680806" & dt() & "16"是怎样的效果呢?(这个只是单纯问一下 我会用join函数改的..)

2012-05-29 11:31
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
收藏
得分:0 
回复 2楼 风吹过b
Dim dta As String
dta = Join(dt, "")
Dim a As String
a = "68999999999999680806" & dta & "16"

这样用对不对?

另外 我程序里写相加功能的 都是想实现 计算出校验码CS CS是从起始帧一直加到CS帧前 然后取后两位放入CS 我的程序自己感觉好像都不太对 能麻烦你也帮我看一下么?
2012-05-29 11:55
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
转换函数
程序代码:
Public Function StoH(cs1 As String, cs2() As Byte) As Long
'传入16进制数据,无分格位,传出BYTE 数组
'cs1 为传入值, CS2() 为传出值
On Error GoTo err1:

Dim i As Long, j As Long
Dim s As String

i = Len(cs1)            '检测长度
j = Int(i / 2)          '计算数组长度
If j <> i / 2 Then      '如果为奇数位
    j = j + 1           '长度加1
End If
j = j - 1               '修正为 第一个元素为 0 的计数

ReDim cs2(j)            '修改数组大小

For i = 0 To j          '分段取值,然后给每个元素
    s = "&H" & Mid(cs1, i * 2 + 1, 2)
    cs2(i) = CByte(s)
Next i

StoH = 0                '执行完成,给成功标记
Exit Function
err1:                   '出现错误

StoH = -1               '给错误标记

End Function


测试代码:

程序代码:
Dim a As String, b() As Byte

a = "68999999999999680806"

If StoH(a, b()) = -1 Then
    MsgBox "输入的数据有错误"
End If

Stop

授人于鱼,不如授人于渔
早已停用QQ了
2012-05-29 16:42
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
收藏
得分:0 
虽然好多地方还是有点迷迷糊糊的 但是好像基本搞懂了...
我先自己研究下 实在不对再来麻烦你啦 多谢~~
2012-05-30 14:56
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
收藏
得分:0 
回复 5楼 风吹过b
程序代码:
Private Sub jiaoyancs(att As String, css As Byte)  '校验和
    Dim i As Long
    Dim l As Long
    Dim checksum As String
    Dim strdata As String, s As String

    checksum = 0

    strdata = Replace(att, " ", "")    '用于将空格去掉
    l = Len(strdata)

    If l Mod 2 <> 0 Then l = l + 1

        For i = 1 To Len(strdata) Step 2
            checksum = checksum + Val("&H" & Mid(strdata, i, 2)) '将16进制字符串转为10进制后相加
        Next i
        s = Right(Hex(checksum), 2)
        css = CByte(s)
End Sub
css=cbyte(s)这提示类型不匹配是怎么回事啊? cbyte不是强制转换为byte类型么 怎么还会出现类型不匹配呢?
2012-05-30 22:41
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
cbyte(S)

当 s 含有不能转化为数值的内容时,报错: 类型不匹配,
当 S 不在 0-255 之间,报错: 溢出。

如果你是 hex 数据用 cbyte 函数的话,必须在前面再加增 &H 前导,成 &HF 或 &HFF 这种类似的数据。
当有 &H 前导时,取值范围就是 &H00 - &HFF 。

授人于鱼,不如授人于渔
早已停用QQ了
2012-05-31 15:28
i吉吉
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2012-4-20
收藏
得分:0 
回复 8楼 风吹过b
嗯 明白啦~
多谢~~
2012-05-31 16:36
快速回复:winsock通讯 16进制byte 程序问题 数组不能赋值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020050 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved