发表于:2002-08-26 16:41:00
2楼
最近在水表的设计中,涉及到485通讯,就看了很多这方面的资料,发现都不能用到项目中来,大部分都是在为了通讯而写,就是ti,ri,然后从4000h,写80个字节到xxx,到处是while(ri == 0);这些不限时的等待,我不禁怀疑这些书的介绍的出发点,也就是设计485协议从哪里出发呢?从哪里考虑呢?我觉得应该从应用来设计这个协议,不是为了通讯而设计,但实际中,一个系统中,考虑到是谁要通讯,为了什么通讯,是偏重于速度呢,还是偏重于质量?
速度可能就要开设短帧,固定长度的帧,等等,质量就要加入各种错误校验作为保证,所以应用的目的不同,编写出的协议也不同;
而且受到你系统的影响也很大,由于时间不充分的系统,比如我这里的,就需要串口中断必须短,对于帧的判断不能做在中断里,接收一个byte,或者发送一个byte都要退出中断,所以一般书上的例
子就用不上了,要摆设多长的帧数组,给几个指针能够高效而又非常节省内存的设计整个485协议,我觉得如果soc是神经系统,485等通讯协议就是神经末梢,如果不畅通,也是要半身不遂的,但我的水平有限,更多的就谈不深,谈不透了,(比如一个485协议涵盖几个层为好,我是不赞成仅仅将她打入链路层以下,作为485本身,就不能说他特指ti,ri等,很多时候我想命令帧的名称如何设置呢?这一帧携带的数据,如何能让想用这些数据的子函数利用呢,而且是很顺利的不增加额外负担的利用呢?)
希望各位先生,各位高手多加指点,不胜感激。
谢谢。
在485协议的数据传输中,经常面对数据中出现帧头标志的问题,有字节重复(如果数据中有帧头标志,就自动重复一次,接收时如果发现帧头字节有两次重复,就认为是数据),等等方案,我的想法是靠标志来区分帧头帧尾,就是一旦接收帧头完毕,就设响应标志,表示之后的都是数据;这样的设计有没有很大的弊端,其他有没有更好的方法??
netmars
16 帖子数 帖子 - 08/20/2002 : 11:11:16
--------------------------------------------------------------------------------
你好啊!
我也正在设计485的网络,使用在煤气表中。我现在也在为485的可靠通信犯难,交流一下吧。我的email:
netmars@citiz.net
zbby
38 帖子数 帖子 - 08/22/2002 : 13:44:26
--------------------------------------------------------------------------------
通了
zbby 发表于 2002-8-21 11:33 侃单片机 ←返回版面
将发送缓冲区,和接收缓冲区作为应用层和下面传输层(或叫数据链路层,什么的)的服务点,两层共享这里,则一些恼人的参数传递问题就不必考虑了,
传输缓冲区尾指针指0,则485打包程序将串口可发送绿灯(应该是黄灯)亮起(直到该进程从接收缓冲区取走数据,才亮绿灯),其他进程可以要求485发送自己的命令或数据,否则只能等待;
进程开始使用485通讯(使用485发送缓冲区,就是在服务点上要求下层的服务),他使串口可发送红灯亮起,阻止其他进程使用该缓冲区;同时通知485打包程序自己的id号,然后该进程退出任务队列,485打包程序在任务队列上循环运行,监视485通讯的接收和成帧情况,这样当485打包程序接收到完整的一帧之后,他根据id号呼叫该进程,(将该进程重新加入任务队列),由于该进程并不管485打包程序运行与否,只要他运行他就到服务点上取数,服务点没有数他就要求服务,所以这次他被485打包程序唤醒的时候,服务点处已经有数了,所以他取走就是,没有其他罗嗦,
这就是我的485的通盘设计,
netmars
16 帖子数 帖子 - 08/23/2002 : 20:54:57
--------------------------------------------------------------------------------
请问你有没有考虑过冲突的解决,就是
当一个设备在发送时如何避免其他设备发送
zbby
38 帖子数 帖子 - 08/23/2002 : 21:38:31
--------------------------------------------------------------------------------
考虑了,如果该进程发现485不是绿灯,则在时钟队列上订一个10ms时钟,由这个时钟10ms之后在将该进程挂上任务队列。而10ms占用485的进程应该差不多处理完乐,如没完这个进程在等10ms