SPCOM/MSCOMM通信数据接收缓存/读取问题(100分)

  • 主题发起人 主题发起人 wildhorsetlj
  • 开始时间 开始时间
W

wildhorsetlj

Unregistered / Unconfirmed
GUEST, unregistred user!
以前采用SPCOM进行数据发送和接收,问题不大,但现在的项目遇到一个问题,不知道该怎么解决,请各位Delphi的XDJM予以指点。
问题如下:
计算机向控制器发送数据包:ff 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00
控制器接收到上述数据包后返回n条数据:
例:
FF 08 01 01 03 00 00 01 01 06 06 1A 09 14 01 AD
FF 08 01 02 03 00 00 01 01 06 06 1A 09 14 01 AC
FF 08 01 03 03 00 00 01 01 06 06 1A 09 14 01 AB
FF 08 01 04 03 00 00 01 01 06 06 1A 09 14 01 AA
FF 08 01 05 03 00 00 01 01 06 06 1A 09 14 01 A9
FF 08 01 06 03 00 00 01 01 06 06 1A 09 14 01 A8
FF 08 01 07 03 00 00 01 01 06 06 1A 09 14 01 A7
FF 08 01 08 03 00 00 01 01 06 06 1A 09 14 01 A6

SPCOM接收完上述数据后再重复发送数据包,形成循检功能。
现在的问题是:
1、采用SPCOM/mscomm重复发送数据包时如何判断数据是否接收完毕?(n=接收数据包的第二个字节值,如上述情况n=8),如何延时?
2、接收到的数据如何临时存储并读取进行二次转换,要求将接收到的数据帧转换成常规的数据段:如总个数 地址1 地址2 状态 等等?
说明:我当时采用了*.log文件形式缓存接收到的字符串,并用另一个TTimer控件定时读取log文件的行信息,进行分解转换,但总出现异常,或报告不能为read或write,每查找到原因;后来改用TMemo控件缓存和读取数据,但在窗体变化或者meme滚动条认为变更时出现数据丢失,或者读取数据失败?
3、针对大批量数据查询和曲线分析,如何处理能够更简洁?可否提供实例?
4、当天的通讯数据保存到数据库好还是txt文本文档形式?一天的通讯记录有120万条左右,而且,要求24小时开机监控,至少不断电持续时间为6-7天时间。
个人邮箱:wildhorsetlj@163.com
上述问题还请各位Delphi的XDJM不吝赐教一二!分不够,可开贴另加!
 
等待中……
 
分数又白了[:D]
 
1、这个需要做协议分析,这是一种典型的分包发送模式,你只要在数据接收部分增加协议数据分析就可以了,每次发送命令前,清除数据包计数,发送命令后,你分析数据,只要满足协议的,你的数据包计数 +1,然后根据你接收回来的数据包数比较即可。
2、数据转存,你可以采用共享内存模式
3、这个问题,根据你实际系统来做的,需要自己考虑的,否则就是别人做的系统,而不是你做了
4、如果数据量太大,实时性要求很高,还是采用文件数据库形式比较好些,但处理起来麻烦些,需要自己作索引,否则,采用数据库好些。
 
to jamcky:
你的解答我不是很容易理解,能详细些吗?或者发邮件?
抱歉,好久不写程序了,对这方面的知识有些弱,敬请指教一二。
 
我觉得:
1.需要分析协议才能判断是一个新包,还是上次的包没有发完。
2.用文件操作我觉得应该加临界区,否则,同时读写文件肯定有异常.
3.数据记录到数据库
3.用数据库应该好些吧,最好用大点的数据库,然后每天创建一张表,不用的历史记录定时清除.
 
这个问题比较好回答,可以使用你原来的文件方式,只不过要注意:
1,读写要串行化,可以使用临界实现。
2,文件要使用fmShareDenyNone方式打开,如果是新创建,需要关闭后再打开。
3,不要使用Timer,因为会占主线程的时间片,建议使用线程替代。
 
每过几天,就有人问这类相同的问题
 
我也有这样问题啊
等待ing
 
spcomm 判断BufferLength
mscomm 判断inbuffercount
通过波特率算下一下.此数据包需多长时间收完,用sleep(n)延时后,去判断上面两个参数.
如果收完后,再具体分析
如果在一定时间内没有收完,清空缓冲区,重发命令.
 
收完数据后,请开辟线程分析.
 
如果每次发送的数据都是16字节,可以设置 MSComm1.RThreshold:=16//当接收缓冲区接收到16个字节数据时,触发OnCOMM事件
第二个问题,你可以设置一个数组变量TempData[16],OnCOMM 事件触发后,TempData[16]:=MSCOMM1.INPUT来实现数据的暂存和后续处理。
 
多人接受答案了。
 

Similar threads

后退
顶部