以前采用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天时间。
个人邮箱:[email protected]
上述问题还请各位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天时间。
个人邮箱:[email protected]
上述问题还请各位Delphi的XDJM不吝赐教一二!分不够,可开贴另加!
解决方案 »
- TFrame 滚动条显示问题
- 200分,谁来帮我看看我Hook窗口创建的代码有什么错误?能Hook成功,只是会导致资源管理器错误
- 请教高手:fastreport 打印问题
- 请教:如何检测一张jpeg图片是RGB色彩还是CMYK色彩?
- 如何在自己自定义的类里封装TADOQuery等类
- 各位高手给介绍一下有关Delphi类编程的经验
- Ip4000有什么优、缺点?
- 谁知道什麽地方有 Delphi访问VSS 控件的下载?
- 当表有用Trigger修改其他表时,保存会出现错误!!!
- 请问在Delphi 中怎样创建txt文档,要求用对话框的那种
- ADO访问SQL要先通过网上邻居访问数据库服务器一次,ADO才能连接,忘大侠帮忙解答
- 如何用Delphi编制程序将SQL Servel 2000中的数据库备份到本地磁盘中?
像你这种情况就应当要存在通讯协议.
哪怕增加一个握手也好:
上位机: ACK
下位机回:ACK
一位机:ff 00 01
下位机:
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
EOF ACK
上位机:ACK
下位机:ACK
上位机:......
1、控制设备大概要10台左右,每个设备下带60多个点,点数可能不定;
2、上位机发送的数据是循环变化的:
当第一台控制器的数据接收完毕后,则发送:FF 00 02 00....
然后直到发送:FF 00 N 00 ....
直到一个大循环结束后再回复到FF 00 01 00...
1.在启动时,加载设备信息;(设备信息可以保存在数据库中);Device:array[0..N] of Tdevice;
2.用定时器对设备队列进行轮循;设备信息队列原理基本可以这样老滤:
type
TDevice=record
DeviceId:byte;//---保存设备的地址码,也用做设备ID号;
DeviceReceviceData:tstringlist;//---保存接收据的数据;
end;
var
Header:byte=0;//---这个就是指向设备队列的指针,从第一个设备开始;
处理数据的相关过程自己可以定义了....
自己设计record,根据地址把采集值区分.把数据存放在file of record这样的文件里.或者使用FileStream.只要你程序写的够安全,6.7天小意思.但是记得要定期保存数据,减少数据丢失的可能.
查询,曲线,数据全部都从file of record里读出..速度很快,我重绘一条30天的曲线,也在1秒以内,我用teechart.
串口的那个问题,建议你参考一下cnpack里的cnrs232的代码.