kpcbk 发表于 2008-10-30 16:29:46

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

你好,请问各位高手们,我现在使用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方法里面判断啊?如果程序较大,是不是能够单独出来一个单元直接用来发送接收的,再传给其他单元使用啊?????不知具体是用全局变量还是怎样做,还请高手指导一下,最好能详细一点,小弟不胜感激,谢谢谢谢
                  

NeoYu 发表于 2008-11-7 13:08:17

首先,所有根据返回结果的发送命令的操作都只有在Comm1ReceiveData里判断了;
其次,你可以在Comm1ReceiveData里按feverkim所说的来做就可以;



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

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

lee2k 发表于 2008-11-5 21:47:45

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

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

feverkim 发表于 2008-11-5 21:33:00

如果你仔细看了我给你方法,你就会知道你说的这个事情,绝对不会发生.TIMER的INTERVAL 不要低于100ms

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

kpcbk 发表于 2008-11-2 22:44:01

你好,谢谢你的回答啊,那样会不会有延迟或者接收不到的情况发生啊,比如发送第一个命令,接收不到,而接收到第二个命令发送返回的数据啊,谢谢

feverkim 发表于 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,

kpcbk 发表于 2008-11-1 15:44:58

继续求教中,谢谢

zhu1205 发表于 2008-10-30 19:35:44

我也做过在做串口通信程序,不过是与打印机
可能有一点是差不多的,就是你发送命令并Sleep(n)段时间后就应该先检测返回,要不然你发送第二个命令后返回的信息会把缓冲区的东西覆盖掉.
这方面我也没好办法,反正就是发送了之后就立即处理返回.
页: [1]
查看完整版本: 请教高手们,关于用SPCOMM处理MOBUS RTU 协议的问题啊,无限感激【恢复】