| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 717 人关注过本帖
标题:VB 每分钟写入一个数据到 TXT 文本。数据出现丢失
只看楼主 加入收藏
fengwdp
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-8-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
VB 每分钟写入一个数据到 TXT 文本。数据出现丢失
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
搜索更多相关主题的帖子: 单片机 统计 
2014-08-14 22:42
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:0 
这代码没问题.

无知
2014-08-15 10:58
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
"&H" & TxtReceive = "&HFE"
这表达式好奇葩。
Format$(Now, "general date")
可以用下面代替
formatdatetime(now,vbgeneraldate)

在if前 调试看看 TxtReceive 和 TxtReceiveF 的状态吧。
debug.print TxtReceive ,TxtReceiveF
if .....
2014-08-15 11:06
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
早上看了下代码,没问题。

只有一个猜想。
你这个代码段有没有可能因几个过程(函数)调用,造成在同一时间内同时运行?
如果这样,建议如下修改一下代码:
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、便于维护,当常量需要变化时,修改定义即可,不需要到整个源代码中去查找、分析、修改。

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-15 11:42
fengwdp
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-8-14
收藏
得分:0 
回复 3 楼 bczgvip
因为是跟单片机通讯,返回的值是16进制数。后做了转换,但是怕有其他误判,所有才这样写。
也是初学,很多东西都要慢慢了解,还请多多指教
谢谢!
2014-08-15 12:41
fengwdp
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-8-14
收藏
得分:0 
回复 4 楼 风吹过 b
受教。非常感谢!
其实比较顾虑vb程序这样对文本写入的支持会不会比较差,容易导致有数据丢失。
是否有其他更好的方式去记录一些系统状态?
2014-08-15 12:46
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
这种方法,是最快的一方法了。我也经常用。

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

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

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

[ 本帖最后由 风吹过b 于 2014-8-15 13:48 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2014-08-15 13:47
fengwdp
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-8-14
收藏
得分:0 
回复 7 楼 风吹过 b
又学到一招,哈哈。谢谢!
我一开始还在想写成数据库文档速度会不会快点。
2014-08-16 21:41
gzbaps
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-8-18
收藏
得分:0 
到处学习中。。。
2014-08-19 17:34
快速回复:VB 每分钟写入一个数据到 TXT 文本。数据出现丢失
数据加载中...
 
   



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

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