OpenEdv-开源电子网

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

关于使用RS485通信异常的问题

[复制链接]

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
发表于 2022-5-16 18:10:38 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Soleil 于 2022-5-19 14:15 编辑

使用RS485通信遇到了几个问题,接收使用DMA+空闲中断
1、同一程序,串口波特率115200,将板子485接口通过485转USB接到PC串口调试助手,通信正常
2、同一程序,串口波特率115200,将板子485接口接入需要通信的设备,收到的数据为空
3、同一程序,降低串口波特率至19200,与设备通信正常
4、同一程序,不降低波特率,保持115200,下载到最小系统板,串口外接一个TTL转485,485接入设备,通信正常

请问这样大概会是哪里出了问题
QQ截图20220516193848.png 图为115200波特率下RE引脚和A点的波形,因为手头只有一个探头,就分两次测了,但是时间刻度是一样的

2.jpg 1.jpg RO引脚波形
3.jpg RS485在115200波特率下部分波形:
1652940765556.jpg
RS232在115200波特率下部分波形:
1652940765544.jpg






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-16 18:18:10 | 显示全部楼层
设备的波特率是可以更改的?
上电路看看有没有A加上拉B加下拉。
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-16 19:40:08 | 显示全部楼层
LcwSwust 发表于 2022-5-16 18:18
设备的波特率是可以更改的?
上电路看看有没有A加上拉B加下拉。

加了,帖子重新编辑加上原理图了,接收使用的是空闲中断
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 09:10:07 | 显示全部楼层
Soleil 发表于 2022-5-16 19:40
加了,帖子重新编辑加上原理图了,接收使用的是空闲中断

建议用示波器测一下A、B波形。
另外,可以去掉R9,加大R7、R10再试试。
专治疑难杂症
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2022-5-17 11:46:12 | 显示全部楼层
有可能是阻抗不匹配,我刚看了篇文章说R7、R10的阻值根据波特率是不同的,但是没有给出具体的值,网上有看到这2个阻值取20K,和47K的,3.3K的都有,
vcc端再并个大点的电容,
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 13:33:41 | 显示全部楼层
本帖最后由 Soleil 于 2022-5-17 14:05 编辑
xujian468 发表于 2022-5-17 11:46
有可能是阻抗不匹配,我刚看了篇文章说R7、R10的阻值根据波特率是不同的,但是没有给出具体的值,网上有看 ...

同样的波特率跟PC串口助手的通信又是正常的,我也加大了R7 R10,依然不行
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 14:05:09 | 显示全部楼层
LcwSwust 发表于 2022-5-17 09:10
建议用示波器测一下A、B波形。
另外,可以去掉R9,加大R7、R10再试试。

R9没有接,R7 R9换成了4.7K 依然不行
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2022-5-17 14:05:57 | 显示全部楼层
是不是你的设备程序有问题啊,
我看别人说:串口优先级低于定时中断,造成115200波特率时候,2个数据塞死串口,这是stm32的bug。
解决办法办法有很多,1.串口优先级最高 2.用dma接收,你管他数据是啥。收回来了再分析,看你的串口接收部分,蛋疼。
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 14:29:50 | 显示全部楼层
xujian468 发表于 2022-5-17 14:05
是不是你的设备程序有问题啊,
我看别人说:串口优先级低于定时中断,造成115200波特率时候,2个数据塞死 ...

我用的就是DMA+空闲中断接收的,用外接的自收发485模块好像是正常,感觉是程序的问题了,但是我程序发送完就马上改了接收端引脚电平,不知道为啥还会有错
  1. void MB_SendCmd()
  2. {
  3.         int i;
  4.         printf("Send ModbusRTU->");
  5.         for(i=0;i<8;i++)
  6.         {
  7.                 printf("%02X ",((uint8_t*)&mb_REQ_PDU)[i]);
  8.         }
  9.         printf("\r\n");
  10.        
  11.         HAL_GPIO_WritePin(RS485RE_GPIO_Port,RS485RE_Pin,GPIO_PIN_SET);
  12.         HAL_UART_Transmit(&huart2,(uint8_t*)&mb_REQ_PDU,8,0xff);
  13.         HAL_GPIO_WritePin(RS485RE_GPIO_Port,RS485RE_Pin,GPIO_PIN_RESET);
  14.        
  15.         SetTime(&TimeMB,2000);
  16. }
复制代码
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 14:30:49 | 显示全部楼层
Soleil 发表于 2022-5-17 14:05
R9没有接,R7 R9换成了4.7K 依然不行

如xujian468所说,看看数据、看看波形。
或再加一路USB转485用串口助手接收双方数据。
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 14:51:23 | 显示全部楼层
LcwSwust 发表于 2022-5-17 14:30
如xujian468所说,看看数据、看看波形。
或再加一路USB转485用串口助手接收双方数据。

我外接的自收发485模块收发正常,有没有可能是发送完数据后,芯片来不及切换成接收状态就收到数据了,这种情况该咋处理
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4851
金钱
4851
注册时间
2015-1-10
在线时间
608 小时
发表于 2022-5-17 15:08:44 | 显示全部楼层
外接的TTL转485原理图跟你的一样吗?应该不一样吧
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 15:16:00 | 显示全部楼层
阿侑kevin 发表于 2022-5-17 15:08
外接的TTL转485原理图跟你的一样吗?应该不一样吧

不一样,外接的是自收发的,我这个不是
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 15:16:21 | 显示全部楼层
Soleil 发表于 2022-5-17 14:51
我外接的自收发485模块收发正常,有没有可能是发送完数据后,芯片来不及切换成接收状态就收到数据了,这 ...

嗯,要能用示波器看波形才好判断,一是监测是否发完数据立即切换到接收,二是监测485波形以及收到的数据是否正常.
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 16:27:43 | 显示全部楼层
LcwSwust 发表于 2022-5-17 15:16
嗯,要能用示波器看波形才好判断,一是监测是否发完数据立即切换到接收,二是监测485波形以及收到的数据是否 ...

更新了波形,看波形RE引脚是已经切换了,但是不知道为什么数据还是不对
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 16:33:29 | 显示全部楼层
Soleil 发表于 2022-5-17 16:27
更新了波形,看波形RE引脚是已经切换了,但是不知道为什么数据还是不对

那你看看SP3485的RO脚波形,如果有,那就不是"收到的数据为空",而是接收数据处理存在问题.
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 16:39:10 | 显示全部楼层
本帖最后由 Soleil 于 2022-5-17 16:42 编辑
LcwSwust 发表于 2022-5-17 16:33
那你看看SP3485的RO脚波形,如果有,那就不是"收到的数据为空",而是接收数据处理存在问题.

RO看了下是有波形的,但是感觉波形不太对,更新在帖子里了
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 16:49:33 | 显示全部楼层
Soleil 发表于 2022-5-17 16:39
RO看了下是有波形的,但是感觉波形不太对,更新在帖子里了

RO最左边有一段波形不高也不低,估计是RE为高电平时RO为高阻态,而你的U1_RX也为高阻态,所以很容易受干扰,建议U1_RX配置为输入上拉.也可加在外面加个上拉电阻看一下效果.
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 17:09:57 | 显示全部楼层
LcwSwust 发表于 2022-5-17 16:49
RO最左边有一段波形不高也不低,估计是RE为高电平时RO为高阻态,而你的U1_RX也为高阻态,所以很容易受干扰, ...

加了也不行,看了下19200下的RO波形跟115200的也差不多
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-17 17:24:05 | 显示全部楼层
Soleil 发表于 2022-5-17 17:09
加了也不行,看了下19200下的RO波形跟115200的也差不多

那你把波形展宽些,对比一下19200和115200的波形,看数据位的宽度.A和RO都测一下.
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-17 17:52:42 | 显示全部楼层
LcwSwust 发表于 2022-5-17 17:24
那你把波形展宽些,对比一下19200和115200的波形,看数据位的宽度.A和RO都测一下.

两个波形对比起来都差不多
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-18 17:40:29 | 显示全部楼层
Soleil 发表于 2022-5-17 17:52
两个波形对比起来都差不多

那肯定不对啊。自己算一下波特率,比如9600一个数据位宽度约104us,19200则为52us,115200为8.7us。再对比一下TXD波形与RXD波形。
专治疑难杂症
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-11-3
在线时间
6 小时
发表于 2022-5-19 11:13:44 | 显示全部楼层
本帖最后由 1231 于 2022-5-19 11:21 编辑

485 的收发模式切换时 要加上延迟,,,必须保证接收模式 切换完毕之后       从板 才能发送数据   ,同理 主板也必须等待从板  切换接收模式  完成 才能 发送数据
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-19 14:12:34 | 显示全部楼层
本帖最后由 Soleil 于 2022-5-19 14:30 编辑
LcwSwust 发表于 2022-5-18 17:40
那肯定不对啊。自己算一下波特率,比如9600一个数据位宽度约104us,19200则为52us,115200为8.7us。再对 ...

不是,数据位宽度是有变化的,宽度也符合波特率,我是说整体的波形,我又改成用RS232在115200波特率下和设备通信,通信正常,对比了一下和485的波形也都差不多,查看了下收到的数据波形,一个位一个位对照都一样的,但是485就是收不到正确数据,两个图我放在文末了
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-19 14:32:45 | 显示全部楼层
1231 发表于 2022-5-19 11:13
485 的收发模式切换时 要加上延迟,,,必须保证接收模式 切换完毕之后       从板 才能发送数据   ,同理  ...

从板发送时间是不受控的,但是从波形来看从板发送的时候是已经切换了的
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-19 17:08:25 | 显示全部楼层
LcwSwust 发表于 2022-5-18 17:40
那肯定不对啊。自己算一下波特率,比如9600一个数据位宽度约104us,19200则为52us,115200为8.7us。再对 ...

刚又仔细看了一下,RXD波形一个数据位有13us左右了,我把接口接到USB转485上用PC发数据,数据位宽度又是8.7左右。然后我换成用外接485模块跟设备通信,数据位宽度还是有10us左右,但是接收是正常的。所以这样子的话是我连接的485设备的问题吗
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-19 19:41:31 | 显示全部楼层
Soleil 发表于 2022-5-19 17:08
刚又仔细看了一下,RXD波形一个数据位有13us左右了,我把接口接到USB转485上用PC发数据,数据位宽度又是8 ...

我没看太懂,你把单片机收到的数据弄出来看看啊。
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-19 20:06:08 | 显示全部楼层
LcwSwust 发表于 2022-5-19 19:41
我没看太懂,你把单片机收到的数据弄出来看看啊。

正常收到的数据应该是01 03 04 00 00 00 00 FA 33,文末最后两图就是刚开始接收数据时的波形;现在测试的情况就是:
1、485接口和一个屏幕通信,115200下RO引脚数据位宽度有13us,并且收到的数据异常;
2、485接口使用485转USB模块接入电脑,115200下串口助手发消息,RO引脚数据位宽度8.7us,且接收数据正常;
3、板子外接一个485模块(max13487)和屏幕通信,数据位宽度在10us左右,但是接收数据是正确的;
4、用232与屏幕通信,232RXD引脚数据位宽度8.7us,数据正常
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8609
金钱
8609
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-5-19 20:22:15 | 显示全部楼层
Soleil 发表于 2022-5-19 20:06
正常收到的数据应该是01 03 04 00 00 00 00 FA 33,文末最后两图就是刚开始接收数据时的波形;现在测试的 ...

"数据位宽度有13us"是指高电平、低电平都有13us?此时测过AB波形没?
专治疑难杂症
回复

使用道具 举报

33

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2020-1-19
在线时间
94 小时
 楼主| 发表于 2022-5-19 22:34:32 | 显示全部楼层
LcwSwust 发表于 2022-5-19 20:22
"数据位宽度有13us"是指高电平、低电平都有13us?此时测过AB波形没?

是的,AB波形一个位也是13us,但是我用了一个购买的串口DTU115200和他通信,数据也是正常,外接一个485模块也是正常
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-27 15:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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