vb 溢出 不知道问题出在哪?大虾们帮忙看看!!

wu_bo353378547 2011-03-07 07:31:58
Dim SendNum As Integer '发送数据帧号
Dim Send_Data(0 To 137) As Byte
Dim s As String
Private Sub Send_Frame()

Dim TXData_Sum As Long
Dim c As String
Dim str(32) As Byte
Dim Cin_num, Line_ID, i, j, kk, flag, t As Integer
Dim Cin_Line As String



Dim TempFile As Long
Dim LoadBytes() As Byte
Dim High_bit, Low_bit As String

Send_Data(0) = &H2
Send_Data(1) = 8 '长度
Send_Data(2) = &HE1
Send_Data(3) = &HF1 '命令字和ID
Send_Data(4) = &HFF
Send_Data(5) = &HFF '握手字
Send_Data(8) = &HFF
Send_Data(9) = &HFF

If SendNum > 255 Then
Send_Data(7) = SendNum - 256
Send_Data(6) = &H1
Else
Send_Data(7) = SendNum
Send_Data(6) = &H0
End If

Cin_num = SendNum + 1
'Text2 = SendNum + 1

Line_ID = (Cin_num - 1) * 128 + 1
s = Mid(s, Line_ID, 128)

FormDisp.RichTextBox1 = "第" & Cin_num & "帧提取成功" & vbCrLf '




For j = 10 To 137

Send_Data(j) = Asc(Mid(s, j - 9, 1))

Next


If FormBasic.MSComm1.PortOpen = True Then
FormBasic.MSComm1.Output = Send_Data
End If

End Sub


一到这句Send_Data(j) = Asc(Mid(s, j - 9, 1))循环到J=24就报“实时错误 6”溢出
很急 希望大家帮忙
...全文
233 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu_bo353378547 2011-03-09
  • 打赏
  • 举报
回复
ok 问题解决 我把取出来的数放入数组然后去 数组取数 不够128的我填FF 谢谢大家的支持 !!!!
Open CommonDialog1.FileName For Binary As #TempFile_Num
Top = LOF(TempFile_Num)

For i = 1 To Top

Get #TempFile_Num, i, Show_Data(i - 1)

Next

Close


For j = 7 To 134

Send_Data(j) = Show_Data((j - 7) + (128 * SendNum))

Next

zdingyun 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wu_bo353378547 的回复:]
s 到进入循环我测试过长度 128
s = Mid(s, Line_ID, 128) 这个里面的S 总长度30864
[/Quote]

看来LZ的s字符串中有非单字节字符,以至造成ASC取单个字符值溢出.
建议LZ使用StrConv函数将s字符串转换为字节数组.例:
    Dim sTemp As String
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
Dim yTemp() As Byte
yTemp = StrConv(sTemp, vbFromUnicode)
wu_bo353378547 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zdingyun 的回复:]
注意我增加的代码
Debug.Print Len(s) '测试下s变量字符长度

并注释掉
Send_Data(j) = Asc(Mid(s, j - 9, 1))

进行测试.
[/Quote]
s 到进入循环我测试过长度 128
s = Mid(s, Line_ID, 128) 这个里面的S 总长度30864
wu_bo353378547 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chinaboyzyq 的回复:]
1、二进制文件应该读入字节数组变量(dim s() as byte),而不是读入串变量(Dim s As String)
2、溢出说明Asc(Mid(s, j - 9, 1))大于255或小于0,注意跟踪查检,VB中string变量默认是unicode码。
3、可以测试用midB:
Send_Data(j) = Asc(MidB(s, j - 9, 1))
[/Quote]
读入数组可以呀!但是怎么每隔128位取数呢?取到最后肯定会小于128个数 那时改怎么办?
MidB加了 没用呀 跟踪Asc(Mid(s, j - 9, 1))发现会出现负数 怎么解决呢!!
zdingyun 2011-03-07
  • 打赏
  • 举报
回复
注意我增加的代码
Debug.Print Len(s) '测试下s变量字符长度

并注释掉
Send_Data(j) = Asc(Mid(s, j - 9, 1))

进行测试.
zdingyun 2011-03-07
  • 打赏
  • 举报
回复
显然LZ的变量s实际字符长度没达到循环所需长度.

Option Explicit
Dim SendNum As Integer '发送数据帧号
Dim Send_Data(0 To 137) As Byte
Dim s As String

Private Sub Send_Frame()
Dim TXData_Sum As Long
Dim c As String
Dim str(32) As Byte
Dim Cin_num, Line_ID, i, j, kk, flag, t As Integer
Dim Cin_Line As String
Dim TempFile As Long
Dim LoadBytes() As Byte
Dim High_bit, Low_bit As String

Send_Data(0) = &H2
Send_Data(1) = 8 '长度
Send_Data(2) = &HE1
Send_Data(3) = &HF1 '命令字和ID
Send_Data(4) = &HFF
Send_Data(5) = &HFF '握手字
Send_Data(8) = &HFF
Send_Data(9) = &HFF

If SendNum > 255 Then
Send_Data(7) = SendNum - 256
Send_Data(6) = &H1
Else
Send_Data(7) = SendNum
Send_Data(6) = &H0
End If

Cin_num = SendNum + 1
'Text2 = SendNum + 1

Line_ID = (Cin_num - 1) * 128 + 1
s = Mid(s, Line_ID, 128)
Debug.Print Len(s) '测试下s变量字符长度
FormDisp.RichTextBox1 = "第" & Cin_num & "帧提取成功" & vbCrLf '
For j = 10 To 137

Send_Data(j) = Asc(Mid(s, j - 9, 1))

Next
If FormBasic.MSComm1.PortOpen = True Then
FormBasic.MSComm1.Output = Send_Data
End If
End Sub
chinaboyzyq 2011-03-07
  • 打赏
  • 举报
回复
1、二进制文件应该读入字节数组变量(dim s() as byte),而不是读入串变量(Dim s As String)
2、溢出说明Asc(Mid(s, j - 9, 1))大于255或小于0,注意跟踪查检,VB中string变量默认是unicode码。
3、可以测试用midB:
Send_Data(j) = Asc(MidB(s, j - 9, 1))
dbcontrols 2011-03-07
  • 打赏
  • 举报
回复
单步调试是万能良药?
不单步调试他能知道“循环到J=24就报“实时错误 6”溢出”

[Quote=引用 6 楼 veron_04 的回复:]
你单步调试一下不就知道那个地方溢出了嘛
[/Quote]
贝隆 2011-03-07
  • 打赏
  • 举报
回复
你单步调试一下不就知道那个地方溢出了嘛
wu_bo353378547 2011-03-07
  • 打赏
  • 举报
回复
是2进制文件 没有问题吧?
wu_bo353378547 2011-03-07
  • 打赏
  • 举报
回复
s够 我文件字符数才30864
clear_zero 2011-03-07
  • 打赏
  • 举报
回复
你确定s够长?
wu_bo353378547 2011-03-07
  • 打赏
  • 举报
回复
那循环只是把S里面的数据一位一位的送到数字Send_Data()里面啊 !!发送还没开始呢!!!
dbcontrols 2011-03-07
  • 打赏
  • 举报
回复
发送数据是需要时间的,建议放弃循环,改用Timer

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧