打印
[CAN-bus/DeviceNet]

多个从节点向一个主节发送数据丢失的问题

[复制链接]
4340|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiutie|  楼主 | 2007-4-4 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是BasicCAN,所有收发单项测试都已通过,但是现在遇到了一个很严重的问题:当多个从节点向一个主节发送数据时出现了丢帧现像,比如当两个从节点同时向一个主节点发送500帧数据时,总会收少收到10多帧,我已经调了十几天了,难道BasicCAN不能实现吗,现在没法再往下进行了,我想了好多办法:如加隔离模块、匹配电阻,多个节点同时发送时增大每帧数据发送时间间隔,等等都没有能够解决这个问题,现在没法再往下调试了,请大侠帮忙看一下吧,十分感谢!

相关帖子

沙发
yizaisong| | 2007-4-4 12:25 | 只看该作者

TO:qiutie

你好,你的问题我还没有遇到,我刚开始调CAN,单独发送,能否借你的接收程序参考一下,谢谢你的帮忙,信箱:yzs1980@SOHU.COM

使用特权

评论回复
板凳
zlgCAN| | 2007-4-5 08:30 | 只看该作者

测试并计算一下总线负载率,另在应用层协议上提供保障。

多点通讯时,CAN只保障数据的正确,但不能够保证希望的目标节点一定收到数据。此时,需要一个可靠的应用层协议。

使用特权

评论回复
地板
wxj1952| | 2007-4-5 09:24 | 只看该作者

同时500帧!

两个站点B、C同时向一个站点A发送500帧数据,A如何保证能够区分出接收帧是B还是C站点发来的?!也许你已经做了这个工作,但是这个功能函数需要很大的overhead(开销)吧。这就又引发出了一个流量控制问题。程序更复杂了。
    你好像把SJA1000当做一个很勉强的文件数据(4000字节/分组)通信控制器,这类通信控制器实际上有很多,最简单的(相对SJA1000)--能够与单片机接口的--也可以每帧传输128字节,而且通信协议为内嵌HDLC,流量控制、站点识别都是硬件自动完成的。重要的是,它(们)能够在控制网络(短帧、快速--单字节/帧)的基础上,又能完成256字节/帧的信息传输。

你用SJA1000传输大于单帧的数据,就不能用竞争协议。

使用特权

评论回复
5
qiutie|  楼主 | 2007-4-5 12:44 | 只看该作者

总线负载率大约在%50左右

   总线负载率大约在%50左右,我用了延时处理,总线争抢的时侯明显丢失数据。对于使用应用层协议,那会大大的增加无效数据的开销,处理数据的能力减慢。现在我想问一个问题:当CAN总线在发送数据时如果我们知道目标节点或总线是否处于忙碌状态,我们就可以不发送数据,最关键的我们在发送数据的时侯如何能够知道总线的状态(而不是只查询SJA1000的状态),另外如果数据送到SJA1000的发送缓冲区,目标节点没有成功接收,源节点怎样能够知道对方没有收到进行重新发送。请大家帮忙!
    对于4楼的wxj1952朋友 :“A如何保证能够区分出接收帧是B还是C站点发来的?!”我在PC机上使用CAN卡,用多线程写接收到的数据,并统计发来数据的节点号!

使用特权

评论回复
6
wxj1952| | 2007-4-5 15:16 | 只看该作者

应用层与过载帧

1、“对于使用应用层协议,那会大大的增加无效数据的开销,处理数据的能力减慢。”难道“用多线程写接收到的数据,并统计发来数据的节点号!”不是应用层协议么?
    所以系统性能已经减慢/降低了。
2、“当CAN总线在发送数据时如果我们知道目标节点或总线是否处于忙碌状态,我们就可以不发送数据,......”目标节点叫喊“忙”时,会发出“过载帧”,源节点如何处理?自动吗?

使用特权

评论回复
7
wxj1952| | 2007-4-5 18:34 | 只看该作者

我来装聪明

好像理解了qiutie君的意思,就是当B节点正在发送时,C节点如何保证不启动发送。也就是一个“有限竞争协议”。(因为当初始时,B和C还是要竞争总线的。)
   其实方法很多,我举个例子:每个节点发送完成时,最后发送一个令牌帧,表示“我发送完了”。其它有数据要发送的节点收到令牌后就重新开始竞争总线,竞争失败的节点变为接收单元,等待下一个令牌帧到来才有机会重新竞争总线。
  在这个方案中要注意的是:一定要利用Peli方式的强大功能。什么强大功能?
  1、ALI--仲裁丢失中断;
  2、单次发送(仲裁丢失时不再重发!);
也就是当一个站点收到令牌允许时,开始竞争总线,一旦成功,它可以发送500帧,而不会受到其他节点“加塞”。
如果仲裁失败,由于是单次发送,它不会再次竞争总线(有ALI中断指示)。只能等待下一次令牌。

我们是不是还没发现Peli的这些功能应用?我如果说得不对,给扔个**蛋。

使用特权

评论回复
8
wxj1952| | 2007-4-6 09:09 | 只看该作者

关于ACK响应信号

“多点通讯时,CAN只保障数据的正确,但不能够保证希望的目标节点一定收到数据。此时,需要一个可靠的应用层协议。”

版主的话,意义深远。它说明:如果是点到点的通信,CAN保障的数据正确,对方节点一定会收到正确的数据。多点通信则不然,因为当CAN保障的数据正确时,任何节点都能发出ACK。它不是唯一的希望目标节点。

根据这个原理,只要保证总线上正在通信的两方中,接收方能够发出唯一ACK,而其它接收单元只听不发,沉默不语,就能在低层达到qiutie君的要求了。

如何实现?1、所有站点初始时设置为只听模式,禁止发出ACK。
2、发送节点使用一次性发送,第一次没收到ACK,也许会重发,但是处于只听模式的目标节点只要收到(听到)发给自己的帧,马上改为正常模式,使得总线上只有2个点到点在有效通信。其ACK位信号就是接收方发给发送方的接收响应信号。发送方这时可以设置为正常模式--自动重发模式。

这又是Peli的强大功能之一:只听模式。

使用特权

评论回复
9
qiutie|  楼主 | 2007-4-6 11:16 | 只看该作者

感谢wxj1952的回答!

首先感谢wxj1952的回答,我现在用的是basic_CAN,估计是完成很困难,准备用peliCAN试一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝