一个小程序,实现一个线程读取COM口数据,另一个线程定时保存数据 ( 积分: 15 )

  • 主题发起人 主题发起人 jinms
  • 开始时间 开始时间
J

jinms

Unregistered / Unconfirmed
GUEST, unregistred user!
现在要做一个小程序,在一个窗口里有一个TIMER控件,每隔一秒从COM口读取一次数据,然后按指定的保存时间(比如2分钟)保存一次,请问该怎么做啊,从来没做过多线程,哪位大侠帮帮忙给个例子,或者给个思路,急啊,请帮帮忙,先谢谢了。只有15分了
 
现在要做一个小程序,在一个窗口里有一个TIMER控件,每隔一秒从COM口读取一次数据,然后按指定的保存时间(比如2分钟)保存一次,请问该怎么做啊,从来没做过多线程,哪位大侠帮帮忙给个例子,或者给个思路,急啊,请帮帮忙,先谢谢了。只有15分了
 
大家帮帮忙啊,分不多我再想办法
 
1. 你要做的是从串口(COM口或者说RS232口)读数据并保存吗?
2. 为什么要用线程呢?
3. 串口的数据交换的速度很慢的, 不需要使用线程就能读取并保存;
4. 你打算编写串口通讯方面的程序, 需要多了解一些相关的技术基础;
5. 当然也要有程序设计和delphi编程的一些基础技术, 例如数据、文件...
6. 努力吧, 总有一天你会发现其实什么都很简单的!
 
TO:天河流星
谢谢大侠教诲,是这样的,我的程序在每秒从COM口读数据,然后保存到数据库中,我发现这样做在保存时,容易丢数据,比如测试取半个小时的数据,每三分钟保存一次,大侠看看有什么好方法啊
 
1. 除非你要把数据从伊拉克保存到美国, 否则读取并保存串口的数据是不会丢失的;
2. 一般的串口控件都有事件驱动(有数据可读的时候), 读数据很简单的;
3. (单线程的程序)当你保存数据的时候(可能需要几毫秒)也不会丢失串口突然传来的数据的, 因为串口的系统底层有接收的缓冲区可以保证数据不会丢失的;
 
呵呵,大侠真幽默,那我就在定时读数据的Timer控件的事件中每隔三分钟保存一次数据吗?
 
1. 你使用什么方法读串口(COM)的数据的? 为什么要使用timer呢?
2. 当然,你也可以使用你熟悉的timer控件工作的, 如果你的数据量不大,
多少时间保存一次数据是和下面这三个变量相关的:
2.1. 串口数据量的大小(或者速度), 例如最频繁的时候: 多少字节数/分钟;
2.2. 你自己定义的临时保存数据的缓冲区大小(不知道你是否能理解);
2.3. 其他应用对实时数据的需求(上级规定数据库的实时性需求);
 
我用的是ComPort2.63,每次向下位机发送读取数据的命令,下位机响应返回数据,然后我的程序读取并处理每次最多返回十二个字节,测试时要求每秒返回一次数据(测速度),所以用Timer控件,
 
如果 在 内存中先保存数据 就怕会 断电或死机的情况发生。可以看出你的数据量并不大可以考虑 实时写入数据库。
 
每秒写一次数据库不太好吧
 
不应该用Timer,无论你如何设置Timer定时都有可能丢失数据,应该用控件的OnRecive事件,在响应事件的同时,将数据写入数据库.为什么每秒/实时写数据库不好?你不用给我分,但建议给天河流星多加点分,他说的很好.
 
我的程序是一个串口接四块表,采用轮换的方式读数据
 
1.定义一个array of char做为接收队列
2.每3分钟(可定),触发一个timer事件,保存并清空
3.若array of char满,马上保存并清空
 
另外我也有一问,在用超级终端的时候,用portmon监视,发现没有数据来的时候日志不滚动。我用不断地ReadFile则会产生一大堆日志。请问超级终端是怎么做到的?
 
我也正在做一个类似的程序,485通信方式的,也是用的CPORT组件。单独一个线程进行串口数据读写,对各个设备进行轮询。线程里发一条查询,然后接收数据保存在一个全局变量里。自定义一个消息,接收到完整的数据后通知主线程进行数据处理。
 
大家是怎么实现轮询的?我没用timer,不好用,我想要速度尽量快
 
后退
顶部