打印

RS485奇怪的问题

[复制链接]
2650|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aijia|  楼主 | 2014-8-18 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
好久没用485了,这次想用下,结果出现莫名其妙的问题:首先设定485为读状态,这时如果用数据过来可以接收得到,如果把485设为写状态,也可以写出去,说明485芯片及控制状态部分是对的,但想平时让485处于接收状态,只有写数据时才改变状态,按理说应该是这个样子的,但现象是接收到数据后,在转为发送状态时数据发不出去,控制端也变为了高电平,只能是要么一直可以接收,要么一直可以发送,呆了一样,捣估了二天还是没找到原因,请大家帮分析一下,是芯片状态不能快反应还是其他什么问题,我为了状态变化都加了一个延时了。

相关帖子

沙发
晶犀电阻| | 2014-8-18 16:19 | 只看该作者
本帖最后由 晶犀电阻 于 2014-8-20 15:34 编辑

控制端也变为了高电平

使用特权

评论回复
板凳
ningling_21| | 2014-8-18 16:23 | 只看该作者
原因有很多,还是上电路图...

使用特权

评论回复
地板
aijia|  楼主 | 2014-8-18 16:24 | 只看该作者
485芯片的2、3脚连在一起控制的,用单片机控制的,就是这个控制端要么一直低可以接收数据,要么一直高发送数据,就是不能那种脉冲式工作,平时低,发送时才变成高。

使用特权

评论回复
5
旭日东起| | 2014-8-18 17:03 | 只看该作者
4楼是正解 哈

使用特权

评论回复
6
shell.albert| | 2014-8-18 17:28 | 只看该作者
485片子的RE/DE要控制好,否则就会出这种问题,有时序要求的。

使用特权

评论回复
7
icekoor| | 2014-8-18 17:55 | 只看该作者
本帖最后由 icekoor 于 2014-8-19 08:45 编辑

485的收发控制切换后,要有一定的延时,然后再发送或者接收数据。
曾经用DSP调试过MAX1480A(带隔离的485,单工),开启接收或者是发送后,延时时间需要40us,然后接收或者发送数据。在由发送切换为接收时,延时需要200us,不然不能正确接收数据。

使用特权

评论回复
评论
cool_coder 2014-8-18 21:16 回复TA
你真的确定有这种要求? 
8
chunyang| | 2014-8-18 17:57 | 只看该作者
说明楼主的电路或软件存在问题,检查数据发送期间方向控制电平是否稳定,同时给出接口电路图。

使用特权

评论回复
9
玄德| | 2014-8-18 21:00 | 只看该作者
感觉LZ的道理也很清楚,应当是现场问题,别人帮不上。

换个芯片试试。

使用特权

评论回复
10
cool_coder| | 2014-8-18 21:15 | 只看该作者
aijia 发表于 2014-8-18 16:24
485芯片的2、3脚连在一起控制的,用单片机控制的,就是这个控制端要么一直低可以接收数据,要么一直高发送 ...

有些事情仅用语言描述是不行的,上图吧

使用特权

评论回复
11
jweiok| | 2014-8-18 21:45 | 只看该作者


建议:
1、检查硬件电路,比如A-B间的匹配电阻;
2、程序打断点,用示波器关注485芯片的使能脚电平变化是否跟你预想的一样;
3、用串口助手监控485总线上的收发数据是否正确。
根据LZ的描述,应该是收发控制的时序问题,遇到问题多静心思考。

使用特权

评论回复
12
鸟鸟| | 2014-8-18 22:33 | 只看该作者

使用特权

评论回复
13
JAYLAM| | 2014-8-21 17:17 | 只看该作者
上图会才好分析

使用特权

评论回复
14
aijia|  楼主 | 2014-8-22 17:05 | 只看该作者
RW = 1;
Delay_us(40);
HalUARTWrite( SERIALPORT, Data[5],6);
Delay_us(200);
RW = 0;
就是发不出去,如果让RW一直等于1,就可以发送出去,数据也是对的。或者如果RW一直等于0,则也可以接收,数据也是对的,为什么哪?硬件应该没问题吧,时序也对,还有什么情况产生这种现象哪?

使用特权

评论回复
15
chenluck| | 2014-8-23 11:04 | 只看该作者
可能你HalUARTWrite( SERIALPORT, Data[5],6);这个子程序中没有等到所有数据发送完成就退出了
要特别注意最后一个字节是否发送,

通常数据写入到发送缓冲,只代表启动一个字节的发送,不代表发送完成的!
对WR=0的操作一定要等到发送完成才可以!

比如51芯片,产生发送中断时,只表示SBUF的数据已被取走,但数据还没有被发送哦,此时
如果将WR改为0,将会导致最后一个字节出错

使用特权

评论回复
评论
cjseng 2014-8-25 00:46 回复TA
正解 
16
aijia|  楼主 | 2014-8-26 15:40 | 只看该作者
做了几个试验,因为没有示波器所以头痛,只能通过程序试验,有趣的是我设为连续发送比如3个后将WR设为0,这时只能发送成功2组,最后一个数据发不出去,如果设连续发送4组数据,前面三个成功,最后一个也不成功,调用发送程序后我加了大概200mS的延时才让RW=0,也不行。各位什么情况?我的发送子程序也看了没什么问题,如果有问题,前面的2组也不会成功。

使用特权

评论回复
17
aijia|  楼主 | 2014-8-26 18:46 | 只看该作者
只要是发送后将RW=0,它前面的那组就发送不出去,我查了单片机内部的检测位,如传送字节状态:
0 字节没有被传送
1 写到数据缓存寄存器的最后字节被传送
这里我是等这个位等于1后又延时了50ms再拉低读写控制位也不行,而且加这个延时多少好象也没有起到很大作用,各位大神,帮帮忙吧?我真的没有办法了。

使用特权

评论回复
18
aijia|  楼主 | 2014-8-27 09:01 | 只看该作者

使用特权

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

本版积分规则

15

主题

30

帖子

0

粉丝