tianzhiying 发表于 2012-2-13 09:32:14

请问一个关于485通信的问题

我在485总线上挂了4个节点
然后每个节点将会发送的数据长度不同
A是3个字节或9个字节的
B是5个字节的
C是6个字节的
要怎样才能准确的接收到数据

先说说我的想法
我是打算在串口中断里面接收导数据后判断
A的数据开头是A0,B开头是A1,C开头是A2
根据判断在把接收到的放到对应的数组里面
但是又不想在中断里面做太多的事情
而在死循环里面做的话又担心一个数据还没处理完下一个数据就来了
因为死循环里面还要执行其他操作,有扫描按键,控制输出等。
请问有什么方法

winterv 发表于 2012-2-13 09:37:00

要不给ABC三个节点每个节点建一个链表,每次收到数据分别放在各自的链表里的最后。这样中断只负责从串口缓冲区复制数据到链表里,再在死循环里分别检测3个链表中的数据

huayuliang 发表于 2012-2-13 11:15:01

没有协议?

QQ270571411 发表于 2012-2-13 11:35:03

只要有协议就可以的啊。你要多少个字节都没问题。

tianzhiying 发表于 2012-2-13 17:13:53

我想问485总线有没有检测忙信号的这个功能
就是当我节点想发东西的时候我要检测是不是已经有其他节点在发送
如果有的话我延时一下
如果没有就发出去

hefq 发表于 2012-2-13 18:23:11

老师提问学生答,老师没叫到学生,学生不能提问,不允许大家一起发问,这样大家听不清楚

gongnn 发表于 2012-2-13 19:03:17

回复【4楼】tianzhiying
我想问485总线有没有检测忙信号的这个功能
就是当我节点想发东西的时候我要检测是不是已经有其他节点在发送
如果有的话我延时一下
如果没有就发出去
-----------------------------------------------------------------------

不行的,还是容易冲突。

gwdong 发表于 2012-2-14 09:31:53

接收器如果可以设置超时就很好办.....超时出现就是一个包收到了.

tianzhiying 发表于 2012-2-14 11:10:50

回复【5楼】hefq 何访贤
-----------------------------------------------------------------------


我没有说不允许大家发问
。。。。。

leizisdu 发表于 2012-2-14 11:19:00

"在串口中断里面接收导数据后判断,A的数据开头是A0,B开头是A1,C开头是A2,根据判断在把接收到的放到对应的数组里面"这对串口中断服务程序来说,工作量不是很大吧?./emotion/em024.gif

tianzhiying 发表于 2012-2-14 11:53:52

回复【2楼】huayuliang 花生
-----------------------------------------------------------------------

不明白你所说的协议是什么
各个节点有各个节点的数据
区分的话只是以开头数据+结尾一个字节的校验

sleet1986 发表于 2012-2-14 13:19:28

不仅区分数据,还要区分从机有没有接受完,主机决定那个从机可以发送数据。

duyin2008 发表于 2012-2-14 16:03:27

要作下时间上的处理(自己设计来完成),想法如下:

主机发送基点命令时间间隔要大于数据回收的时间,如节点最长回放数据时间用1T来表示,那么主机发送时间间隔最好为4T,所有的节点都要延时处理
这样得到命令的节点回传数据,其余的节点延时等待不处理,延时时间是数据最长发送基点的发送时间间隔两倍,为2T,这样回传数据,只能主机得到,从机都在等待中,当接收完数据后,所有的节点都变成了接收命令状态(接收状态),再过1T-2T时间,主机发来命令,重复以上时序,就可以区分接收每个节点数据了.
整个发送命令,和接收数据就在4T内来完成了.

huazidianzi 发表于 2012-2-14 18:34:57

回复【楼主位】tianzhiying
-----------------------------------------------------------------------

modbus 通信协议

pjx001 发表于 2012-2-14 19:32:02

顶一下

trytoreach 发表于 2012-2-15 21:13:48

一般RS-485采用半双工工作方式,任何时候只能有一点处于发送状态
中断中你肯定要接收数据与转存的:建立一个足够大的缓存数组就可以了;
死循环中:对缓存数组进行数据提取与处理,并清空缓存数组就可以了;
页: [1]
查看完整版本: 请问一个关于485通信的问题