小女子求救:打开文件并发送出去需要用时5分钟?

pingguo9108 2007-03-22 08:19:34
'打开文件
FileName = App.Path & "\nnn.mcs"
Open FileName For Input As #1

Do While Not EOF(1) '循环至文件尾
'读出一行数据放入one_line中
Line Input #1, one_line
'得到一行数据,然后串口发送处理
MSComm1.Output = one_line
'延时10ms
Sleep (10)
DoEvents
Loop

‘关闭文件
Close #1


上面是我的一段打开文件并发送出去的程序,文件的大小为800kb,先不说按握手协议发,单就上面读一行马上发送出去,把这个文件发送出去就需要5分钟,我想问问高手有没有什么更快的方法,最好控制在1分钟左右,我想到延时不用,可是下位机收到的数据就会出错,我现在用的波特率是38.4kb/s,再高了下位机收到的数据也会出错,请高手指点一下,谢谢!!
...全文
198 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
把sleep(10)去掉,用波特率38.4用时需要3分零20秒

差不多吧,前面的计算结果166秒是理论值,实际情况会比它稍慢些的。

你换用datou985的Delay函数吧,前面of123的代码有问题。
renjun24 2007-03-22
  • 打赏
  • 举报
回复
关注,帮顶
datou985 2007-03-22
  • 打赏
  • 举报
回复
把你的代码里面的sleep(10)去掉
然后把
Private Declare Function GetTickCount Lib "kernel32" () As Long
'调用api实现延迟200ms
Private Function Delay(MSceond As Long)
Dim i As Long
If MSceond < 2 Then Exit Function
i = GetTickCount
Do While GetTickCount - i < MSceond
DoEvents
Loop
End Function
加上
把sleep(10)的地方用delay(10)代替就可以
pingguo9108 2007-03-22
  • 打赏
  • 举报
回复
把sleep(10)去掉,用波特率38.4用时需要3分零20秒
datou985 2007-03-22
  • 打赏
  • 举报
回复
If tt < GetTickCount() Then Exit Do
of123的问题出在这里了
你把这里用我的那段代码该一下就可以了
他的目的是想实现延时,实际上是没任何作用的
datou985 2007-03-22
  • 打赏
  • 举报
回复
【VB声明】
Private Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long

【说明】
用于获取自windows启动以来经历的时间长度(毫秒)

【返回值】
Long,以毫秒为单位的windows运行时间
datou985 2007-03-22
  • 打赏
  • 举报
回复
GetTickCount是一个api函数

Private Declare Function GetTickCount Lib "kernel32" () As Long
'调用api实现延迟200ms
Private Function Delay(MSceond As Long)
Dim i As Long
If MSceond < 2 Then Exit Function
i = GetTickCount
Do While GetTickCount - i < MSceond
DoEvents
Loop
End Function

private sub form_load()
delay(200) '200即为参数200毫秒
end sub
pingguo9108 2007-03-22
  • 打赏
  • 举报
回复
刚才试了一下,还用我原来的程序,保留sleep(10),把波特率提高到115.2kb/s,发送完这个文件需要4分零8秒,把sleep(10)去掉,波特率115.2用时1分零10秒,看来问题在sleep这里了,大家看看有没有好的办法解决阿,我用of123的方法。老死在那里,还请高手阿
pingguo9108 2007-03-22
  • 打赏
  • 举报
回复
我用了of123的方法。不过没有看到结果,一运行就死了,程序就没响应了,想问问GetTickCount起什么作用,是怎么用的,第一次接触,查资料没有查到啊,不好意思
tt = GetTickCount() + 10
If tt < GetTickCount() Then Exit Do
上面两句是什么意思呢?谢谢
pingguo9108 2007-03-22
  • 打赏
  • 举报
回复
差不多吧,我那一行是41字节,算起来也得1万多行,波特率一提高就出错,不知道是怎么回事

jadeluo 2007-03-22
  • 打赏
  • 举报
回复
上面的Sleep拼成Slepp了,汗...
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
5分钟是因为你用了Slepp函数, 它可真的是让程序Slepp了, 在Slepp期间, 串口数据发送也被暂停了, 这样就活生生地多出了好多时间。
按理论值来推算:(5分钟 * 60秒/分钟 - 166秒) / 10毫秒 = 13300,你的那个文本文件有13300行?

换成of123的代码,应该就能省去这些等待的时间了。
不过,要想达到1分钟内传输800KB的目标,至少需要把波特率调整到115.2Kbps才行。
of123 2007-03-22
  • 打赏
  • 举报
回复
Private Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
Dim tt As Long

FileName = App.Path & "\nnn.mcs"
Open FileName For Input As #1

Do While Not EOF(1) '循环至文件尾
'读出一行数据放入one_line中
Line Input #1, one_line
'得到一行数据,然后串口发送处理
MSComm1.Output = one_line
tt = GetTickCount() + 10
Do While MSComm1.OutBufferCount
DoEvents
If tt < GetTickCount() Then Exit Do
Loop
Loop

‘关闭文件
Close #1
pingguo9108 2007-03-22
  • 打赏
  • 举报
回复
那照这么说就没有办法了吗?有没有其他更快的控件呢,依你说最多也需要三分钟,那我怎么要5分钟呢,不知道问题出在哪里?
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
按照38.4Kbps的波特率,传送800KB的数据,至少得要166.67秒(约2.78分钟),1分钟是传不完的。
800(KByte) * 8(bit/Byte) / 38.4(Kbps) = 166.67

7,763

社区成员

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

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