485多机通信出现的怪问题

2020-02-04 09:06发布

做了个485通信板,七个U,专用于做实验用。485采用的自动收发电路,也就是只发0,1装上下拉电阻完成的那种。硬件很简单。但在实验中出现怪现象,即系统开机后,主机与分机能通信,但不通信的分机即只能接收到一个正确的数据,就是第一个地址码。而后面的数据码全出错。按理应该不会产生的串口中断,也产生了。通信协议最后有一条复位命令,是发给所有从机的。但除通信的从机能正确收到,其它从机收到的全是错误的数据。百思不得其解。不知各位是否也遇上过类似问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
newcanking
1楼-- · 2020-02-04 10:04
楼主最好贴上程序才好分析啊
gongnn
2楼-- · 2020-02-04 15:05
 精彩回答 2  元偷偷看……
BDXing6
3楼-- · 2020-02-04 17:03
本帖最后由 BDXing6 于 2012-4-21 11:34 编辑

先上485图

未命名.jpg (161.15 KB, 下载次数: 1)

下载附件

2012-4-21 11:26 上传


一共有6个。编号08~13.临时画的草图,下面ACC实际是地。
程序很简单。这个是发送程序
                        setb tr1                                                        ;打开定时器一
                        clr ti                                                                ;清串口发送接收中断标志
                        clr ri
                        clr sm2                                                                ;清地址桢接收响应位,自已作为主机,接收所有数据
                        setb tb8                                                        ;第一个数据为地址桢
                        clr join                                                        ;连接标志复位
                        setb es                                                                ;开串口中断
                        mov sbuf,SSO_ToAdd                                        ;发送握手信息
这个是接收
                        jb rb8,int_s2                           ;是地址或命令广播(地址从1~32H,广播命令为80~0FFH),从机才能收到
                                                   ;========从机接收数据桢=========
                        mov a,r5                                ;R5用于保存接收数据的个数,开始时为零
                        jz int_s1                                   ;是接收的第一个数据
                        mov @r1,sbuf                           ;数据送缓冲区
                        inc r1
                        djnz r5,int_s_ret
                        mov a,#SSI_Add                        ;数据接收完成,进行校验和处理(第一个数据一直加到第n-1个数据应等于第n个数据)
                        call DataAdd
                        cjne a,sbuf,int_sp                ;校验和不等转移
                        mov sbuf,#MyNum                        ;数据接收正确,回发本机编号,数据接收完成,等待广播命令
                        setb DataSSI                            ;数据到达标志置位
                        jmp int_s_ret                       

int_sp:                mov sbuf,#Com_Err                ;数据传输出错,回送错误信息,要求重发数据
                        jmp int_s_ret
int_s1:                                                                   ;接收的第一个数据字节为数据个数                       
                        mov r5,sbuf                                   ;第一个数据是以后的数据个数,送R5
                        mov r1,#SSI_Add                           ;接收缓冲区地址送R1,准备接收数据
                        mov @r1,sbuf                           ;数据个数也同时存入数据缓冲区,作为以后的校验用
                        inc r1                                        ;数据缓存区地址加一
                        dec r5                                        ;已接收一个数据
                        jmp int_s_ret

int_s2:                                        ;=========从机地址或命令桢处理============
                        mov a,sbuf

                        jb acc.7,int_s5                        ;是广播命令转移
                        cjne a,#MyNum,int_s_ret ;不是呼叫本机退出
                        clr tb8                                        ;清发送地址桢位
                        clr sm2                                           ;是呼叫本机,清SM2,准备接收数据
                        setb Join                                ;连接建立标志置位
                        mov r5,#0                            ;R5用于存放应接收的数据个数,接收数据前清零

                        mov sbuf,a                             ;将本机编号发回发送方,确认连接。
                        jmp int_s_ret
int_s5:        
                                                ;===========广播指令处理============
                        mov Com_Add,a                        ;收到广播指令不回复,命令保存在寄存器最后一个单元中(地址为0fh)
                        setb command                        ;广播命令到达标志置位
                        jmp int_s_ret               
BDXing6
4楼-- · 2020-02-04 22:21
程序很简单,应该是没有问题。
wye11083
5楼-- · 2020-02-05 01:14
看不懂你的图,你画个好点的吧。接上拉/下拉时,请仔细检查每个端口是否都接上拉/下拉了,用示波器打一下看看上升沿下降沿是否符合逻辑。我前几天把两组I2C总线合到一起之后就不正常了,几个设备经常没有响应。后来把第二条I2C总线的上拉焊回去(开始想着已经有上拉了,就用不到了),通信就再也没有问题了。
BDXing6
6楼-- · 2020-02-05 02:51
这个图的原理很简单:
在接收数据时,TX为1,三级管截止,485处于接收状态,总线数据送入RX。
发送时,当TX为0时,三级管导通,485在发送状态,同时,TX送入D输入端。TX为1时,三级管截止,485在接收状态,但AB的上下拉使得总线上为1。以此来自动切换485的收发
其实,硬件的问题应该不大,因为,网络上几个节点均可正常通信(说明软件也应该是没有问题的),问题在于,只有通信的节点机能正常接收数据,而没有通信的即接收的是错误的数据。想不明白。

一周热门 更多>