搜索
bottom↓
回复: 39

RS485通讯自发自收有什么好处!!!

[复制链接]

出0入4汤圆

发表于 2005-11-10 12:09:24 | 显示全部楼层 |阅读模式
请问:

做RS485通讯中.

如果同时使能发送和接收,那么自已发去的可以正确地收回来的.同时,上位机也能收到



但是.如果上位机软件发过来,怎么就一个字符都收不到啊???



这软件到软件问题还是硬件问题啊????
-----此内容被tarzar于2005-11-14,16:22:20编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2005-11-10 12:30:18 | 显示全部楼层
简单的方法就是用示波器看看上位机发送时信号是否正常了。

出0入4汤圆

 楼主| 发表于 2005-11-10 13:38:05 | 显示全部楼层
用示波器怎么看啊,



发数据可是一瞬间的示波能看得到吗??

出0入4汤圆

 楼主| 发表于 2005-11-10 13:44:12 | 显示全部楼层
我才都串口调试助手不停地发送数据..



在示波器能看到有一些能产生低电平但是我不知道,到怎么样才看出它发出来的是不是正确的?

出0入0汤圆

发表于 2005-11-10 13:57:44 | 显示全部楼层
485是半双工的,怎么可以同时发送和接受呢,应该是你通讯设置有问题。

出0入4汤圆

 楼主| 发表于 2005-11-10 14:23:19 | 显示全部楼层
是半工的,,



但是我手上的图是这样的







它接收是直接地的,也就是说永远使能的..

据说是可以自发自收, 只是发送了再自己收回来没什么意义

我在想不知道是不是想通过种方式来校验一下发出去的数据是不是正确的...



因为电路版不是我画的, 是别人画的,



现在关键是,接收不到数据一点都没有接到..

出0入0汤圆

发表于 2005-11-10 14:33:54 | 显示全部楼层
按照电路,可以接到的!!!

出0入4汤圆

 楼主| 发表于 2005-11-10 14:46:30 | 显示全部楼层
我现在就是把DE设为低!!!



然后,,只允接收,但是就是收不到!!!!



如果自已,它就可以收到奇怪!!!!!

出0入4汤圆

 楼主| 发表于 2005-11-10 14:54:02 | 显示全部楼层
难道初始化的程序有错啊,

实在找不到什么原因来了,



//UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9600 (0.0%)

void uart0_init(void)

{

UCSR0B = 0x00; //disable while setting baud rate

//UCSR0B[RXCIE0,TXCIE0,UDRIE0,RXEN0,TXEN0,UCSZ20,RXB80,TXB80]

//Bit 7 – RXCIE0: RX Complete Interrupt Enable

UCSR0A = 0x00;

//UCSR0A[RXC0,TXC0,UDRE0,FE0,DOR0,PE0,U2X0,MPCM0]

UBRR0H = 0x00; //set baud rate high

UBRR0L = 47; //set baud rate low

UCSR0C = (BIT(UCSZ01)|BIT(UCSZ00));//设置成8位;

  //UBRR0 = 47; // set the baud rate

UCSR0B = ((1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0));



//本文件用的全局变量作初始化

UART_RxHead                 = 0;

UART_RxTail                = 0;

UART_Rx_Main_Ptr   = 0;

}

/***************************************************************************

*  函数名   : uart0_rx_isr

*  入口    : void

*  出口    : void

*  目的    :  



*  描述    : 接收采用中断接收的方式(只负责接收)

            UART_Rx_Main_Ptr是让主程序来查接收数据的多少,,进而解包,处理

***************************************************************************/

#pragma interrupt_handler uart0_rx_isr:19

void uart0_rx_isr(void)

{

        unsigned char data;

        unsigned char tmphead;

       

        data = UDR0; // read the received data        

        // calculate buffer index

        tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;//0x7f

        UART_RxHead = tmphead; // store new index

        if ( tmphead == UART_RxTail )

                {

                // ERROR! Receive buffer overflow

                }

        UART_RxBuf[tmphead] = data; // store received data in buffer

    UART_Rx_Main_Ptr++;                        //主指针加1        

}

出0入0汤圆

发表于 2005-11-10 15:16:28 | 显示全部楼层
A、B分别加上拉、下拉电阻。

出0入4汤圆

 楼主| 发表于 2005-11-10 15:23:22 | 显示全部楼层
那中间那个120还要不?



我现在就是去试一下,,



对了那加多少啊,,,10K?

出0入4汤圆

 楼主| 发表于 2005-11-10 15:46:10 | 显示全部楼层
问题找到了...



接收的时候..发送使能应当为低!..

我本来一直认为可以同时发送和接收(只是接收的数据没有意义..虽然他是半双工,)
-----此内容被tarzar于2005-11-10,17:02:12编辑过

出0入0汤圆

发表于 2005-11-11 08:48:12 | 显示全部楼层
to tarzar 泰山:

发送使能为低时TxD引脚为通用I/O功能,置位后TxD引脚为USART功能。跟接收有什么关系吗?

出0入0汤圆

发表于 2005-11-11 10:13:26 | 显示全部楼层
电路485第2脚不应接地,2、3联接在发数据时MCU不会收到自已的数据

出0入4汤圆

 楼主| 发表于 2005-11-11 17:00:28 | 显示全部楼层
to wsdzj:



发送使能是用别人IO口来控制的,不是引脚来控的



我再把图片贴上来,



让你看清楚,,使能的不是接在TXD

出0入4汤圆

 楼主| 发表于 2005-11-11 17:03:10 | 显示全部楼层
其实RE接地,也是我的一个不解之处,



(因为电路图不是我设计的)

我想有可能是及时的转为接收吧,还有可以发送时顺便接收过来看一下发送出去的是不是正确的

出0入0汤圆

发表于 2005-11-12 00:06:56 | 显示全部楼层
没什么不好理解的,看看所用芯片的文档就知道了,如果希望在发送时顺便接受自己发出的数据(一般用于检验是否冲突,但也不大保险),最简单的接法就是把RE接地;如果发送数据时不希望接收自己发出的数据,最简单的接法就是把RE和DE短接,然后接到发送使能控制。

对于象485这样的无防冲突机制的总线,在总线上同一时刻只能有一个发送器处于启动状态,其它在接收状态,如果有一个以上的发送器处于启动状态,芯片很容易进入保护状态(例如一个发送器输出0同时另一个发送器输出1,这样在两个发送器串联短接到电源上,发送器的内阻一般很小,所以有较大的电流通过,很芯片快热而进入保护状态)。

对于半双工的485网络,驱动器和接收器由一个状态进入另一个状态需要一定时间,不同芯片有区别,但一般都大于5ms,为了使写好的程序可以使用不同的收发器,一般进入/退出发送的时间都选一个比较长的延时,例如20ms以上。如果每个节点每次发送的数据量很少,例如几个字节,则总线效率会比较低,实时性没有保证;但如果象考勤机一样,连续传送大量数据就很好。



如果整个网络传输数据不多,没有实时性要求,价格敏感,例如抄表,则使用485是个不错的选择;但如果要实时性、可靠性好,价格又不大敏感,例如工控,还是选用CAN为好。

出0入4汤圆

 楼主| 发表于 2005-11-12 08:41:45 | 显示全部楼层
驱动器和接收器由一个状态进入另一个状态需要一定时间,一般都大于5ms,???



有那么长啊??



楼上可以告知是看哪个参数啊,??我看了两分都没有那么长的时间



我在MAX3443E的datasheet里的

swithing characteristics over recommended operating conditions

下面的一个表里看到的一些参数是都是us级别的,最大的也不会超过10us

Driver Propagation Delay  

Driver Enable Time from Output High

Driver Disable Time from Output High

Driver Enable Time to Output Low

Driver Disable Time to Output Low



接收的参数也是差不多一样的...



还有一下分SN65LBC184.这些时间就更短了...

出0入0汤圆

发表于 2005-11-13 00:39:30 | 显示全部楼层
datasheet是这样写的,其实e文我也只是半懂不懂,看个大概,我给的延时是经验值,我用SN75176B测试,刚开始时使用100us,接收到的全是乱码,网络瘫了,我以为是连线有问题或卖的片不好,折腾了好些时间。后到21ic看过,有人说使用10ms,有人说太长了,使用1ms就够;于是就从1ms开始做延时测试,对于75176B来说,超过8ms后基本可以稳定工作,到20ms后让它跑了1天也没出现网络瘫痪的情况;一般的半双工485芯片是和75176B兼容的,所以我个人以为如果要大多芯片可用,应该使用一个大于等于20ms的延时。

当然,这也不一定是485芯片的问题,我用的是M8,刚开始也怀疑或许是程序set port时不是马上完成的,而是有一个延时,这个延时可能比较大(但应该不会大于ms级吧?)因为这很难设计一个合理的测试方法,也就不再追究了,反正这样用没问题就是。



要做工程,应该自己进行测试,我说的只作参照,如果你得到其他结论,希望能进行交流。

出0入0汤圆

发表于 2005-11-14 14:20:55 | 显示全部楼层
图纸是半双工,永远不能同时发送,因为两线只能作为一条信号线,如果要同时使用,建议使用全双工485(max491)。我建议,现把485去掉,直接用串口调试,调试好了,再加485,毕竟485是硬件问题。

出0入4汤圆

 楼主| 发表于 2005-11-14 16:28:52 | 显示全部楼层
谢谢!



呵呵,我用的是20us,也是暂时没有发现问题,但是我现在只是试验而以,,并没有应用到实际当中..



不过,如果实时性要求不是很高,多延时一下也无仿,反正延时又不用钱的...



在这里再次感觉谢大家的热心解答!!!

出0入0汤圆

发表于 2005-11-14 16:43:40 | 显示全部楼层
驱动器和接收器由一个状态进入另一个状态需要一定时间——时间很短的,us级。

硬件没问题,看看你的软件,还有协议——不会是协议问题吧,那太菜了!!!



不过,先建议一点:把120电阻去掉调试!!!!!!!

呵呵呵呵!

出0入4汤圆

 楼主| 发表于 2005-11-14 16:48:31 | 显示全部楼层
把120电阻去掉



有没有跟没有什么区别啊????

{没有120,也是能通讯的!,我试过了,当时是忘了加,呵呵}

出0入0汤圆

发表于 2005-11-14 17:23:21 | 显示全部楼层
我认为自发自收的好处是知道什么时候数据发送完成,以便及时释放占用的总线。

出0入0汤圆

发表于 2005-11-15 11:46:27 | 显示全部楼层
在通信中,几乎全是自发自收,例如:你连了一个MODEM,拨号发" AT 88313721",此时你每发一个字母他都给你回一个相同的字母,这就是你在屏幕上看到的,如果串口线没有连,什么也看不到。半双工也能做到,只不过下位机只在收到命令时再发,而上位机发完命令后要等一下。

出0入0汤圆

发表于 2005-11-15 17:34:41 | 显示全部楼层
我觉的上面的便用方法非常简单:

用485通信具然连这些逻辑关系都搞不清楚,我真是不感相信。

MAX487转换时是需要时间,但我实测只要1uS多就行了,怎么还有10mS,这也太吓人了吧。我做过中间数据转换设备,都是用CPLD实时处理的,从来没有出现过任何问题。



中间并的电阻,我们不用的,因为我们的联网很大,都是几千米上百个设备的。我们在发送数据前都会自动检测当前线路是能正常,只有正常时我们才会发数据。

如果并了电阻线路上电压几乎为0,处于MAX487的盲区,这样很不稳定,空易产生错误。

出0入0汤圆

发表于 2008-9-5 18:01:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-3 22:28:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-4 02:20:31 | 显示全部楼层
那个120欧的电阻不是终端电阻吗?是总线两端的的设备好像要用 其他就应该不用了吧。

出0入0汤圆

发表于 2011-6-2 11:38:03 | 显示全部楼层
好深奥,看不懂,自己得加强学习了

出0入0汤圆

发表于 2011-6-2 12:35:25 | 显示全部楼层
楼主的问题很简单,你的下位机 发送 接收都同时允许,下位机 自己发的自己肯定能收到,这个是没有疑问的,也不需要我多说。485 是半双工通讯。
此时假如上位机也发送数据,在你的网络上就变成了有两个处于发送状态的终端。(下位机一直处于发送状态啊,不要以为你不往串口里面写数据 他就不处于发送状态)。

485网络不具备冲突检测,所以 毕竟保证任一时刻 整个网络中 只有一台处于发送状态。

下位发送数据完毕后,务必将下位机的发送使能引脚关闭。

出0入0汤圆

发表于 2012-9-6 18:47:29 | 显示全部楼层
啊莫论坛学习环境就是好,学习了

出0入0汤圆

发表于 2012-9-7 16:02:32 | 显示全部楼层

出0入0汤圆

发表于 2012-9-7 16:02:48 | 显示全部楼层
不从 mark 一下

出0入0汤圆

发表于 2012-9-25 12:02:01 | 显示全部楼层
mark                                                                                    

出0入0汤圆

发表于 2012-11-27 12:07:52 | 显示全部楼层
发送的时候,接收输出是三态的。

出0入0汤圆

发表于 2012-11-27 14:52:00 | 显示全部楼层
你要检测自己发的是不是对的。那接一个232转485的模块到电脑打开监控就行了。

出0入0汤圆

发表于 2012-11-28 09:30:03 | 显示全部楼层
自发自收是基于程序考虑的。在程序里分辨到底是自发自收还是他发自收或者他发她收。

出0入0汤圆

发表于 2013-1-29 20:47:23 | 显示全部楼层
mark 一下

出0入0汤圆

发表于 2013-7-18 10:42:06 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表