OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9920|回复: 21

RS485切换到发送模式后要等待一段时间再发数据,否则数据发出的是错误的,这个问题如何解决

[复制链接]

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
发表于 2016-4-26 14:32:19 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 天山狐狸 于 2016-4-26 14:50 编辑

如题,按照原子的代码,用串口1操作485,发送一个字节时,如果485切换到发送模式不等待50us,发出去的数据变成了0XFF。等待50us后再发送数据,数据就正确了。


原子的例程中怎么没有等待可以发送呢,我的怎么就必须等待呢?

谢谢


附:我用stm32f407芯片,168M频率

[mw_shl_code=applescript,true]void USART_SendByte(uint8_t Data)
{
  Enable_485Tx;//使能485发送
  delay_us(50);

  USART1->DR = (Data & (uint16_t)0x01FF);
  while (!(USART1->SR & 0x0040));//等待发送完成
  Enable_485Rx;//默认到485接收
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

485要保证通讯正确率,最好延时,因为RS485转换芯片从接收切换到发送要时间的。如果是加了光耦隔离的,可能时间比50us还要长才能保证。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2016-4-26 14:32:20 | 显示全部楼层
485要保证通讯正确率,最好延时,因为RS485转换芯片从接收切换到发送要时间的。如果是加了光耦隔离的,可能时间比50us还要长才能保证。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-4-26 14:41:09 | 显示全部楼层
原子串口1也是用来操作485的吗?如果物理电路已经成功切换不会发生这种问题的,应该是你控制时序问题
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 14:48:21 | 显示全部楼层
365mcu 发表于 2016-4-26 14:41
原子串口1也是用来操作485的吗?如果物理电路已经成功切换不会发生这种问题的,应该是你控制时序问题

我用的是自己画的板子,没有用原子的。。

如果是时序问题,为什么加延时后就好了呢
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 14:52:02 | 显示全部楼层
365mcu 发表于 2016-4-26 14:41
原子串口1也是用来操作485的吗?如果物理电路已经成功切换不会发生这种问题的,应该是你控制时序问题

代码已更新到楼主位。。

必须加这个延时,否则数据成0xFF
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2016-4-26 14:54:35 | 显示全部楼层
不需要发每个字节都需要等待,你只需要转换方向的时候,等待就好
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2016-4-26 14:55:09 | 显示全部楼层
按照你的代码,发个数据得累死,一个字节变一次
学无止境
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 14:57:29 | 显示全部楼层
jermy_z 发表于 2016-4-26 14:55
按照你的代码,发个数据得累死,一个字节变一次

那怎么弄,我默认是接收,发送时才切换到发送的。。

这个函数只是发送一个字节的,发多个字节不用这个函数。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 14:58:13 | 显示全部楼层
jermy_z 发表于 2016-4-26 14:54
不需要发每个字节都需要等待,你只需要转换方向的时候,等待就好

以前在stm32f103上没有这个等待时间都好好的,关键是原子的代码中也没有等待。。。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2016-4-26 15:00:45 | 显示全部楼层
天山狐狸 发表于 2016-4-26 14:57
那怎么弄,我默认是接收,发送时才切换到发送的。。

这个函数只是发送一个字节的,发多个字节不用这个 ...

如果需要发数据,则

1、将数据方向转为发送,等待50us
2、发送全部需要发送的数据
3、将数据方向切为接收
学无止境
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2016-4-26 15:01:21 | 显示全部楼层
天山狐狸 发表于 2016-4-26 14:58
以前在stm32f103上没有这个等待时间都好好的,关键是原子的代码中也没有等待。。。

反正我写的时候都有延迟一小会,硬件切换需要时间的
学无止境
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 15:07:53 | 显示全部楼层
jermy_z 发表于 2016-4-26 15:01
反正我写的时候都有延迟一小会,硬件切换需要时间的

哦,最新测试情况:

我在while1中不延时,发送一个字节没有问题。但是在串口中断中接收到一个字符后,马上发出去,这时数据就不对了。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-4-26 15:22:34 | 显示全部楼层
天山狐狸 发表于 2016-4-26 15:07
哦,最新测试情况:

我在while1中不延时,发送一个字节没有问题。但是在串口中断中接收到一个字符后, ...

时序问题
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 15:27:27 | 显示全部楼层

这个该如何解决
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 15:28:32 | 显示全部楼层
lvehe 发表于 2016-4-26 15:22
485要保证通讯正确率,最好延时,因为RS485转换芯片从接收切换到发送要时间的。如果是加了光耦隔离的,可能 ...

以前用没有加都工作正常,以前是max3485,现在换成ADM2483,看手册,切换时间2483要比3485短很多,怎么却这样呢?

回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2016-4-26 15:34:31 | 显示全部楼层

跟时序有个P的关系,硬件切换需要消耗时间,搞过485的都知道
学无止境
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 15:37:07 | 显示全部楼层
jermy_z 发表于 2016-4-26 15:34
跟时序有个P的关系,硬件切换需要消耗时间,搞过485的都知道

好吧,,,看来我必须得多加点延时了
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2016-4-25
在线时间
16 小时
发表于 2016-4-26 15:37:31 | 显示全部楼层
我还没懂怎么485通讯,楼主能不看看你的代码或者发下原子哥的关于485通讯的代码。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 16:01:44 | 显示全部楼层
kaiyuan123 发表于 2016-4-26 15:37
我还没懂怎么485通讯,楼主能不看看你的代码或者发下原子哥的关于485通讯的代码。

我的发送代码已经在楼主位了。。

下面是原子的发送代码
[mw_shl_code=applescript,true]//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //设置为发送模式
          for(t=0;t<len;t++)                //循环发送数据
        {
                while((USART2->SR&0X40)==0);//等待发送结束                  
                USART2->DR=buf[t];
        }         
        while((USART2->SR&0X40)==0);//等待发送结束       
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                //设置为接收模式       
}[/mw_shl_code]
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-4-26 16:16:42 | 显示全部楼层
关键你用的是半双工 全双工就没事了  硬件的事情软件解决不了,你可以试试把延时一点一点的减少,看看最少是多少
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-4-26 16:24:52 | 显示全部楼层
止天 发表于 2016-4-26 16:16
关键你用的是半双工 全双工就没事了  硬件的事情软件解决不了,你可以试试把延时一点一点的减少,看看最少 ...

嗯,多谢啦

回复

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2019-8-2
在线时间
33 小时
发表于 2020-12-2 15:21:38 | 显示全部楼层
楼主有试过在ucos中添加RS485吗?我现在在ucos中添加485后只能接收不能发送
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 06:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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