搜索
bottom↓
回复: 7

请教高手们,关于用SPCOMM处理MOBUS RTU 协议的问题啊,无限感激【恢复】

[复制链接]

出0入0汤圆

发表于 2008-10-30 16:29:46 | 显示全部楼层 |阅读模式
你好,请问各位高手们,我现在使用DELPHI+SPCOMM想开发一个对下位机设备的串口通讯程序,但是使用过程中遇到这样的问题,还想大家指教指教。比如MOBUS RTU 的协议我使用了3号命读取下位机的两段寄存器,(比如读取的寄存器是0200H~023FH,和0280H~02BFH)两段寄存器都是有64个的,
我用发送的命令分别是:03   03   02   00   00   40   44   60
                 :03   03   02    80   00   40   45   88 
                  地址 3号命令 起始位置   读取长度    CRC校验

接收的格式是:地址 命令号 数据长度 数据1 数据2........CRC校验
             (两者返回数据开头都是:03 03 80 xx xx .........,返回长度也一样)

对于以上的情况,就是发送的起始地址不同,但是读取长度是相同的,两个命令返回的数据都是131个字节,在SPCOMM的Comm1ReceiveData方法中要判断的话,要怎样判断啊?我是直接定义了一个定时器定时发送以上两个发送命令的,是不是能够设定我发送第一个命令后,一定要等接收了数据,判断后,再发送第二个命令这样啊?不是很懂, 不知一般是用长度来区分还是怎样做才好,迷茫中,请高手们指教指教

还有一个问题就是,如果我发送的命令比较多,是不是都要在一个Comm1ReceiveData方法里面判断啊?如果程序较大,是不是能够单独出来一个单元直接用来发送接收的,再传给其他单元使用啊?????不知具体是用全局变量还是怎样做,还请高手指导一下,最好能详细一点,小弟不胜感激,谢谢谢谢
                  

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2008-11-7 13:08:17 | 显示全部楼层
首先,所有根据返回结果的发送命令的操作都只有在Comm1ReceiveData里判断了;
其次,你可以在Comm1ReceiveData里按feverkim所说的来做就可以;



比如发送第一个命令,接收不到,而接收到第二个命令发送返回的数据啊,谢谢 
----------------------------
你所担心的问题发生的可能性不大,前提是你处理好时序问题:)

比方说,你没有接受到第一个命令的返回结果就不要发第二个命令!Good luck!

出0入0汤圆

发表于 2008-11-5 21:47:45 | 显示全部楼层
我也用DELPHI下做了一个MODBUS RTU的通信软件,也发生了类似的问题,无论是什么控件,发送过于频繁后,接收总有掉包或错误数据!我试过控件自已的事件引擎,又试过线程监控轮询式,都没法实时处理接收包,没办法,最生只有在发送一个包,后强行等待返回或超时,才算解决通信问题!我看不是程序问题,而是WINDOWS的串口处理问题,因为大多控件到底层都是类似的!

楼主要是有什么新办法或想法,交流交流!

出0入0汤圆

发表于 2008-11-5 21:33:00 | 显示全部楼层
如果你仔细看了我给你方法,你就会知道你说的这个事情,绝对不会发生.TIMER的INTERVAL 不要低于100ms

本贴被 feverkim 编辑过,最后修改时间:2008-11-05,21:39:46.

出0入0汤圆

 楼主| 发表于 2008-11-2 22:44:01 | 显示全部楼层
你好,谢谢你的回答啊,那样会不会有延迟或者接收不到的情况发生啊,比如发送第一个命令,接收不到,而接收到第二个命令发送返回的数据啊,谢谢

出0入0汤圆

发表于 2008-11-2 11:07:39 | 显示全部楼层
在模块中定义2个变量FRbuff,ID_CMD_TAG

1.在ComReciveData事件中把收到得数据放到FRbuff中
2.在timer事件中
  2.1:先判断FRbuff数据格式是否正确,格式正确就处理.当然根据2.3得命令ID_CMD_TAG来判断是哪个命令
  2.2:清空FRbuff
  2.3:发送特定命令.比如你有10条指令要发送,发送第一条得时候置ID_CMD_TAG=1,

出0入0汤圆

 楼主| 发表于 2008-11-1 15:44:58 | 显示全部楼层
继续求教中,谢谢

出0入0汤圆

发表于 2008-10-30 19:35:44 | 显示全部楼层
我也做过在做串口通信程序,不过是与打印机
可能有一点是差不多的,就是你发送命令并Sleep(n)段时间后就应该先检测返回,要不然你发送第二个命令后返回的信息会把缓冲区的东西覆盖掉.
这方面我也没好办法,反正就是发送了之后就立即处理返回.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 20:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表