串口通讯,多个不同结构帧接收处理 ( 积分: 100 )

  • 主题发起人 主题发起人 taiyuntao
  • 开始时间 开始时间
T

taiyuntao

Unregistered / Unconfirmed
GUEST, unregistred user!
各位富翁:
我先概述一下我的问题:我在做一个通信的小软件,串口通信,协议modbus-rtu.要求每次查询的寄存器不超过32个,下位机数量会随使用场所变化。因为提供的寄存器地址不连续,我只能分五次查询。现在我的做法如下:
发送:在一个timer里分五次发送完查询的寄存器;
接收:定义一个接收变量将接收到的字符保存,定时去处理这个接收变量。我定时处理的作法是首先i:=pos('1F04XX',接收变量),如果i>0接着截取固定的长度,1F为设备地址,04为功能码,xx为设备回应的数据字节数,但现在我在现场试验过,这样处理截取的数据会出错,常常头是正确的但数据长度明显不正确,还有的是头正确但中间又包含别的头。请富翁们给我支招!
 
学过用状态机么?
 
你应该去参加高考、上学好好学一下通讯原理。
 
呵呵,这个问题和高考有关么。。。
可以这样做,仅供参考:
寄存器不连续,不知道是怎么个不连续法?如果地址不是相隔太远,可以考虑一次读,然后只关心需要的寄存器数据。
分几次读也行,是好不用TIMER,这个东东不可靠的。开个查询线程,用消息来处理接收的数据。发送数据在主线程进行,不过要和查询线程同步。
用pos,这个这个。。。还是不要吧,接收到数据后,有长度信息,用不着POS。
接收数据时注意,如果用ONREAD,最好先延时,然后读,不然读不全的,这个好象是和系统底层有关的,参考有关资料;不过对于主从式通讯,直接主动READ好了,不用ONREAD,也是要延时处理;如果不延时的话,就是分次读,直到读完全部数据,处理会复杂点。
 
你的做法欠考虑,我的建议
1、做一个发送线程,从数据寄存器文件读入要发的寄存器地址,完成发送
2、起一个线程负责接收,将接受的数据存入缓存队列,备用
3、做一个处理线程负责从缓存队列取数分析,处理
你的程序设计思路不好
 
其实可以用一个线程负责数据接收,另一线程负责数据解析和发送,数据发送组帧的rtu地址和寄存器地址可以定义一个结构,rtu地址和寄存器地址只需从配置表中获取就行了。只要控制好设备和相应的寄存器区就行了
 
PLC此类的控制协议一般都是回车,换行结束,所以只要判断是否是回车换行就算一个命令的结束, 如果用MODBUS的二进制命令格式,那么就需要设计一个状态机。

这个问题应该其实就是: 从一堆数据中怎么识别出一个协议帧
 
你应该采用数据包校验方式校验帧的完整性,一帧数据都没收齐,就急着处理数据,肯定会出错了。
 
GSM短信远程抄表系统管理端源代码(pc控制手机模块收发GSM短信)
http://www.pgz8.cn/Software/Catalog93/4151.html

串口操作等,都是自己写的代码.不用现成控件的.你可以下载来看看,还有实现了pc控制手机模块收发gsm短信,函数都是自己写的。线程方式操作,提高效率。

可能对你有帮助.

下面是他的说明:

系统说明:GSM短信远程抄表系统管理端(原理:pc控制手机模块收发GSM短信)
作者:Cooling
QQ: 21156410
Email: 21156410@qq.com
主页:http://www.pgz8.cn
可以任意传播,但请保留以上信息,有任何问题,欢迎交流。谢谢
这是一个商业软件的demo部分,收发短信的部分函数,全部是站长2002年写的,不用现成控件,线程操作.或许对短信系统开发有帮助.当时没有实现中文短信的收发,这个系统中也不需要.所以如果哪位朋友有兴趣,可以完善下,如果你写好了,也希望能给我发来一个哦.谢谢

用户名密码都是admin,在界面上右键操作.
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
后退
顶部