搜索
bottom↓
回复: 39

马老师:max485发送多字节之间为什么加延时1.7ms 就问题不加发送数据不是丢就是 错位

[复制链接]

出0入0汤圆

发表于 2010-4-1 21:35:51 | 显示全部楼层 |阅读模式
max485发送多字节之间为什么加延时1.7ms 就问题不加发送数据不是丢就是 错位。


是美信的max485  上下拉都接了1k   但是现在发送多个字节 各个字节之间不加延时 发送出去的数据就错误,加延时1.7ms就没问题 ,比这时间短也不行

为什么马老师  急需解决

出0入0汤圆

发表于 2010-4-8 00:37:43 | 显示全部楼层
你使用的485是半双工的吧。如果是,那在发送和接受的转换之间,需要控制MAX485的发送和接受控制端。估计是你的这个控制端的控制产生的错误。

按通常9600,8,0,1的格式,1秒内是9600,10个bit为一个字节,那么1秒钟能串出960个字节,每个字节的串出时间为1/960,需要1ms多的时间。

你发送多个字节,发送各个字节之间max485是不需要控制的。但你是否发送完最后一个字节,就将MAX485转换成接受方式了?

如果是这样,那么你发送完最后一个字节后,延时2ms后再把max485转换为接受方式。

因为你的程序把最后一个字节放到USART的寄存器中后,AVR的硬件还需要1MS多的时间才能真正把数据串出完成。如果你的程序马上把max485转换成接受方式,那么max485根本就没有把最后的字节发完,那么接受方就接收不到最后的字节(但前面的字节应该是正确接收的)。

你在发送多个字节,各个字节之间加延时成功,估计其实恰巧只是最后那个字节的延时起了作用。

以上不知道我分析的是否对,你参考一下。
头像被屏蔽

出0入0汤圆

发表于 2010-4-8 01:24:12 | 显示全部楼层
回复【1楼】machao
-----------------------------------------------------------------------
马老师好久不见了。

深夜打个招呼先。

出0入0汤圆

发表于 2010-4-8 02:37:44 | 显示全部楼层
回复【2楼】armok 阿莫

谢谢了。

是你比较忙了,我隔上几天都会到这里看看的。

出0入0汤圆

发表于 2010-4-10 17:31:19 | 显示全部楼层
编译环境,通讯协议等都会有一定影响的。。。。

出0入0汤圆

发表于 2010-9-10 17:12:56 | 显示全部楼层
麻烦询问楼主,问题最后是怎么解决的,最近我也遇到与此相似的问题。
发送多字节,发送函数需要每个字节之间有延时。大概2ms
困扰很久,没有解决掉。

出0入0汤圆

发表于 2010-9-13 09:00:43 | 显示全部楼层
回复【5楼】dugutianma
麻烦询问楼主,问题最后是怎么解决的,最近我也遇到与此相似的问题。
发送多字节,发送函数需要每个字节之间有延时。大概2ms
困扰很久,没有解决掉。
-----------------------------------------------------------------------

1楼已经有详细叙述,难道还不明白吗?


    假如:需要发送100个字节,其中前99个字节使用“空中断”发送,最后一个字节必须使用“发送完成中断”发送

出0入0汤圆

发表于 2010-9-22 15:49:19 | 显示全部楼层
楼上描述不全面。

我在1楼分析过了。

如果需要发送100个字节,这100个字节按正常方式发送,在最后一个字节发送完成后,发送控制方需要延时一定的时间(比如2ms,与发送bps有关)才能将RS485的状态改变成接收方式。

这个时间是必要的,它必须大于完整一个字节由硬件串出到达对方的传输时间,使对方能完整收到最后的字节。

接收方在收到信息后,也不能马上应答,也需要等待一段时间。要超过发送方延时转换位接受的时间(比如,5ms后)。

这个就是数据流的控制,需要自己制订的。

出0入0汤圆

发表于 2010-9-22 18:28:53 | 显示全部楼层
这个自己做的时候也发现了。这可能是接收发送使能单独控制的原因。

出0入0汤圆

发表于 2010-10-26 12:45:36 | 显示全部楼层
大家好,我同是用M16的,程序先是用在232时,上传数据给PC是正常的,但是改用485时(与PC用了转换器,并换了几个的了,控制端也注意了),但是上传给PC机的总是00 00 00(有时候一个,有时两个,有时三个的,要看我上传是什么) 这样的,无论我上1还是‘a’,也好,各位老兄帮帮忙哦

出0入0汤圆

发表于 2011-7-13 17:22:53 | 显示全部楼层
刚刚碰到这个错误,正不知道怎么解决呢,谢谢马老师了。

出0入0汤圆

发表于 2011-7-13 21:48:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-18 15:56:47 | 显示全部楼层
我是用MSP430串口接ISL83070E的RS485芯片,发送数据帧,
把最后一个字节的数据写入缓冲区,查询MSP430发送完成之后,while (!(IFG2&UCA0TXIFG));才关闭RS485芯片的发送使能,最后一个字节总是错误。
使用延时程序,最后一个字节就能正常发送了。
我觉得有问题的是,既然已经查询MSP430发送完成,为什么最后一个字节还不能正常发送。ISL83070E的速度不会慢于MSP430。

出0入0汤圆

发表于 2011-8-18 18:15:30 | 显示全部楼层
回复【12楼】xingkong911
-----------------------------------------------------------------------

我觉着发送标志置位是说发送缓冲器已经空了,但是总线上的电平变化还有时间

出0入0汤圆

发表于 2011-8-19 19:03:14 | 显示全部楼层
发送缓冲器是已经空了,但数据只是送到MCU内部的并转串出的电路中,由它通过RS485芯片传送到对方,并不表示对方已经全部收到!

一个字节的串出时间是根据设定波特率决定的,但不管波特率多高,都需要一定的时间,才能一位一位的串出。

所以,发送缓冲器是空只是表示你可以将下一个准备要传送的数据写如发送缓冲器了,但并不是说刚才的那个数据已经全部串出了。

如果发送缓冲器一空,你马上把RS485芯片关掉发送,转成接收,此时实际最后那个字节可能只是串出了2-3位,后面几位的串出,由于RS485芯片状态已经改变,所以根本没有送到通信线上传到对方。

这个问题,已经在本拦中有多次讨论了。

出0入0汤圆

发表于 2011-8-19 19:26:43 | 显示全部楼层
MX485不太智能啊

出0入4汤圆

发表于 2011-8-19 20:46:13 | 显示全部楼层
发送完中断已完全解决了这个问题,AVR里有详细说明

出0入0汤圆

发表于 2011-8-20 01:37:56 | 显示全部楼层
• Bit 6 – TXC: USART Transmit Complete
This flag bit is set when the entire frame in the transmit Shift Register has been shifted
out and there are no new data currently present in the transmit buffer (UDR). The TXC
Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can
be cleared by writing a one to its bit location. The TXC Flag can generate a Transmit
Complete interrupt (see description of the TXCIE bit).

• Bit 5 – UDRE: USART Data Register Empty
The UDRE Flag indicates if the transmit buffer (UDR) is ready to receive new data. If
UDRE is one, the buffer is empty, and therefore ready to be written. The UDRE Flag can
generate a Data Register empty Interrupt (see description of the UDRIE bit).
UDRE is set after a reset to indicate that the transmitter is ready.
================================================================================================

to 16楼:

你的解释正确,但不够详细,容易使人误解。上面我贴上的是AVR的USART的2个标志位解释:“发送完成”和“发送缓冲器空”的说明。

对于UART接口,在标准51中只要一个标志,而在AVR中有2个:一个是“发送缓冲器空”,另一个是“发送完成”。这两个标志位的概念是不同的。

许多人认为,学过51就好象所有的8位MCU都掌握了,但不知道实际上还是有很大的差别。从这个小的问题上,也说明51的落后。

因此,你使用什么芯片,应该仔细看手册,彻底了解每个标志位的意义,这样才能设计出好的可靠的产品。

mp430我没有用过,更没有看过手册。但从12楼和13楼的帖子看,基本上可以确定是他们说的是“发送缓冲器空”,而不是“发送完成”。

是否MP430有2个标志位,我不能讲。但许多朋友在这个问题上是模糊的。

所以我提倡学习AVR,在许多细节上AVR做的不错,至少在UART的发送上,提供了2个不同意义的标志位。

出0入0汤圆

发表于 2011-8-20 02:31:17 | 显示全部楼层
我是用这种方法避开这个问题,在包前包后附加0xFF,同时在说明书中申明有此两字节数据存在(是无用的),接收方有可能收到,但不保证完整。特别是对方用的是自动的485/232转换器的时候。

出0入0汤圆

发表于 2011-10-28 20:14:38 | 显示全部楼层
有道理,

出0入0汤圆

发表于 2012-2-27 17:19:32 | 显示全部楼层
发表此贴只为感谢  :machao 马潮,,,你提出的解决方案让我解决了困扰两天的难题,在此感谢。。。。。难以言表。。。。。

出0入0汤圆

发表于 2012-3-7 16:43:23 | 显示全部楼层
感谢马潮老师,同样的问题用马老师的方法得以解决。

出0入0汤圆

发表于 2012-5-27 11:00:53 | 显示全部楼层
mark,刚开始使用485,对我很有帮助,谢谢马老师

出0入0汤圆

发表于 2012-6-4 08:58:28 | 显示全部楼层
谢谢马老师,刚开始用430,也是存在这个问题,想了好久没搞明白,这回算是彻底明白了

出0入0汤圆

发表于 2012-7-10 17:05:59 | 显示全部楼层
呵呵   学习了                                                                                             

出0入0汤圆

发表于 2012-10-30 16:34:40 | 显示全部楼层
在这里学习了,485不错,便宜又好用。
头像被屏蔽

出0入0汤圆

发表于 2012-11-5 15:05:57 | 显示全部楼层
我也用过,485通讯解决了232距离短的问题,很好!

出0入0汤圆

发表于 2013-7-5 18:42:46 | 显示全部楼层
machao 发表于 2010-4-8 00:37
你使用的485是半双工的吧。如果是,那在发送和接受的转换之间,需要控制MAX485的发送和接受控制端。估计是 ...

马老师,我做过试验,字节之间的延时去掉,PC收到到数据就会出错,求解?

出0入0汤圆

发表于 2013-7-5 23:37:04 | 显示全部楼层
bbxyliyang08 发表于 2013-7-5 18:42
马老师,我做过试验,字节之间的延时去掉,PC收到到数据就会出错,求解? ...

如果基础知识不扎实牢固,你连问题产生的原因也分析不出的。解决方案就是基础要扎实。

出0入0汤圆

发表于 2013-7-6 09:10:18 | 显示全部楼层
machao 发表于 2013-7-5 23:37
如果基础知识不扎实牢固,你连问题产生的原因也分析不出的。解决方案就是基础要扎实。 ...

马老师,说的对,我是菜鸟,我会好好学习,就是看到您说可以不延时可以,但我试验过不行……

出10入113汤圆

发表于 2013-7-6 09:21:31 | 显示全部楼层
看几年前的帖子,马老师真是高手啊

出0入0汤圆

发表于 2013-12-1 22:24:41 | 显示全部楼层
感谢马潮老师精辟透彻的讲解,使我彻底明白问题的根源,485发送转接收间延时问题,我也困扰一段时间,也精确计算到每个字节发送时间,就是搞不懂为什么还需要2毫秒,这个问题今天算彻底明白了,是发送开始到接收到的时间总和啊,呵呵,再次感谢马老师!还有你的那本AVR的书写的很好,几年前第一时间就买了给了我很大帮助,虽然近2年avr用的少了,但也收益非浅!

出0入0汤圆

发表于 2014-2-13 19:25:32 | 显示全部楼层
不但串口,包括硬件SPI,硬件IIC这类接口,都需要注意这个问题!

出0入0汤圆

发表于 2014-2-13 20:52:18 | 显示全部楼层
这个非常有用!!

出0入0汤圆

发表于 2014-2-13 22:17:25 | 显示全部楼层
阿莫一点半还不睡觉,马老师两点半了也还没睡觉,都睡觉真晚啊

出0入0汤圆

发表于 2014-10-13 10:27:38 | 显示全部楼层
学习了。。

出0入0汤圆

发表于 2014-10-14 20:36:34 | 显示全部楼层
使能485发送5ms ->开始发送 ->最后一个字节发完  ->延时5ms关485使能

出0入0汤圆

发表于 2014-10-16 17:51:35 | 显示全部楼层
machao 发表于 2011-8-19 19:03
发送缓冲器是已经空了,但数据只是送到MCU内部的并转串出的电路中,由它通过RS485芯片传送到对方,并不表示 ...

485延时问题讲得很明白啊,以前碰到过,不知道怎样解决,现在知道根本原因了

出0入0汤圆

发表于 2014-11-11 10:42:29 | 显示全部楼层
学习~~~~~~~

出0入0汤圆

发表于 2016-3-3 11:07:36 | 显示全部楼层
本帖最后由 60飘过 于 2016-3-3 11:10 编辑

波特率:9600
芯片:电路不是我设计的,无延时。
程序框架:默认接收->中断接收(用了超时)->解码(方向切换)->查询标志位(发送完毕)->数据全部发送完毕->打开定时器(不清楚进中断时间)->延时780us(几百次一个乱码),790us(10分钟连续通讯正常),最终延时1个字节时间->设备运行良好,已投产。
没有查阅任何资料(不能上网,没资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 19:37

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

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