注册 登录
编程论坛 VB6论坛

VB 每分钟写入一个数据到 TXT 文本。数据出现丢失

fengwdp 发布于 2014-08-14 22:42, 717 次点击
VB 写了个程序,说白了每分钟写入一个数据到TXT文本。在最后统计的时候发现数据出现丢失。要怎么解决。。。
还有就是有时候会突然不写入数据了。数据为单片机传入的一个脚位状态信号。信号没问题,因为有另一个程序读取时正常的。
小弟初接触VB编程,请大侠们多多指教
程序代码:
    If "&H" & TxtReceive = "&HF8" And "&H" & TxtReceiveF = "&HFE" Then
    LBLIST.Caption = Time & "System Running" & Chr(13) & LBLIST.Caption
        Open Database1 For Append As #1
    str = "1, " & Format$(Now, "general date") & ", System Running ," & "run(s)," & runA & "," & " stop(s)," & stopA & ","
    Print #1, str
    Close #1

    ElseIf "&H" & TxtReceive = "&HFE" And "&H" & TxtReceiveF = "&HF8" Then
    LBLIST.Caption = Time & "System Stoping" & Chr(13) & LBLIST.Caption
    Open Database1 For Append As #1
    str = "-1, " & Format$(Now, "general date") & ", System Stoping ," & "run(s)," & runA & "," & " stop(s)," & stopA & ","
    Print #1, str
    Close #1
    End If
8 回复
#2
Artless2014-08-15 10:58
这代码没问题.
#3
bczgvip2014-08-15 11:06
"&H" & TxtReceive = "&HFE"
这表达式好奇葩。
Format$(Now, "general date")
可以用下面代替
formatdatetime(now,vbgeneraldate)

在if前 调试看看 TxtReceive 和 TxtReceiveF 的状态吧。
debug.print TxtReceive ,TxtReceiveF
if .....
#4
风吹过b2014-08-15 11:42
早上看了下代码,没问题。

只有一个猜想。
你这个代码段有没有可能因几个过程(函数)调用,造成在同一时间内同时运行?
如果这样,建议如下修改一下代码:
1、文件号,不要固定为 1 ,而使用 FreeFile 函数取一个。
2、打开文件后立即写入,然后立即关闭。把与写文件无关的语句放到 文件外操作。
如 str = "1, " & Format$(Now, "general date") & ", System Running ," & "run(s)," & runA & "," & " stop(s)," & stopA & ","
这句,放到 open 前执行。

----------------
If "&H" & TxtReceive = "&HF8" And "&H" & TxtReceiveF = "&HFE" Then
这个比较,我建议你转化为 byte 来比较,而不要用 字符串比较。
如:
If CByte("&H" & TxtReceive) = &HF8 And CByte("&H" & TxtReceiveF) = &HFE Then
--------------
字符串比较中,对大小写是有区分的。
--------------
你多次使用 "&H" & TxtReceive 及 "&H" & TxtReceiveF
完全可以使用二个变量,保存这二个值。
如 dim TR as byte,TRF as byte
TR=CByte("&H" & TxtReceive)
TRF=CByte("&H" & TxtReceiveF)
那么 IF 就可以写成了
If TR = &HF8 And TRF = &HFE Then

==========
最后,要有使用常量的习惯。
你程序里
 &HF8  和   &HFE 这是二个常量,直接写出值,如果时间一长,就很难记得这个值代表什么意思。
建议这里使用常量。
使用常量:
1、程序可读性好。
2、便于维护,当常量需要变化时,修改定义即可,不需要到整个源代码中去查找、分析、修改。
#5
fengwdp2014-08-15 12:41
回复 3 楼 bczgvip
因为是跟单片机通讯,返回的值是16进制数。后做了转换,但是怕有其他误判,所有才这样写。
也是初学,很多东西都要慢慢了解,还请多多指教
谢谢!
#6
fengwdp2014-08-15 12:46
回复 4 楼 风吹过 b
受教。非常感谢!
其实比较顾虑vb程序这样对文本写入的支持会不会比较差,容易导致有数据丢失。
是否有其他更好的方式去记录一些系统状态?
#7
风吹过b2014-08-15 13:47
这种方法,是最快的一方法了。我也经常用。

一句话,打开文件的时间要短,写入后立即关闭,就不会容易导致出现问题。

你说数据丢失,我想在考虑是不是因为重复调用此段代码,然后 打开文件时如 文件号已使用导致打开 文件失败,而导致写入操作失败。

我一般的做法是把写 文件的写成一个过程,
然后传递需要写的数据进去,写完就返回。
整个过程就5条命令。
一个数据定义,一个取 文件号。
然后就是 打开,写入,关闭。

[ 本帖最后由 风吹过b 于 2014-8-15 13:48 编辑 ]
#8
fengwdp2014-08-16 21:41
回复 7 楼 风吹过 b
又学到一招,哈哈。谢谢!
我一开始还在想写成数据库文档速度会不会快点。
#9
gzbaps2014-08-19 17:34
到处学习中。。。
1