OpenEdv-开源电子网

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

rs485自动收发,新手求助,谢谢回答

[复制链接]

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
发表于 2023-2-22 17:46:23 | 显示全部楼层 |阅读模式
1金钱
请问RS485自动收发的串口配置和一般的RS485的串口配置有什么区别吗?

最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2023-2-22 17:46:24 | 显示全部楼层
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 08:36:36 | 显示全部楼层

那需要发送数据的时候是不是将TX脚拉低,然后接收的时候将TX脚拉高就好了?
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 08:46:18 | 显示全部楼层

请问原子哥,我这样配置对吗

void usart_485_init(void)
{       
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //打开USART1的时钟
       
        /*USART3_TX -> PB10 , USART3_RX -> PB11 , 485_DIR -> PB10,低电平进入发送模式,高电平进入接收模式
        当TX高电平,mos管导通,RE和DE引脚接地,进入接收模式。当TX低电平,mos管截止,RE和DE引脚接高电平,进入发送模式
        TXD发1,AB就发1;TXD发0,AB就发0*/
        //usart_tx
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;       
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_11;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel                                                 = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority         = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                         = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                         = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        USART_InitStructure.USART_BaudRate                                 = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
        USART_Init(USART3,&USART_InitStructure);
       
        USART_ClearFlag(USART3,USART_IT_RXNE);        //清除中断标志
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);        //设置中断方式
        USART_Cmd(USART3,ENABLE);        //使能终端       
}

回复

使用道具 举报

10

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2014-4-12
在线时间
182 小时
发表于 2023-2-23 09:30:04 | 显示全部楼层
如果没有自收发电路的话,你需要手动控制485-dir来确定你当前电路是接收还是发送,其他配置没有区别。
参考公众号上一篇文章:https://mp.weixin.qq.com/s/JbjVM4gPnb346z932GpgYQ
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 09:41:44 | 显示全部楼层
我的原理图是画成了自收发的,这样配置的自收发对吗
我配置这样之后,我使用USB转485发送数据到串口,但是串口没数据显示,调成hex显示也没有

  1. void usart_485_init(void)
  2. {       
  3.         USART_InitTypeDef USART_InitStructure;
  4.         NVIC_InitTypeDef NVIC_InitStructure;
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.        
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //打开USART1的时钟
  9.        
  10.         /*USART3_TX -> PB10 , USART3_RX -> PB11 ,  PB10,低电平进入发送模式,高电平进入接收模式
  11.         当TX高电平,mos管导通,RE和DE引脚接地,进入接收模式。当TX低电平,mos管截止,RE和DE引脚接高电平,进入发送模式
  12.         TXD发1,AB就发1;TXD发0,AB就发0*/
  13.         //usart_tx
  14.         GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;
  15.         GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
  16.         GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;       
  17.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  18.        
  19.         GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;
  20.         GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_11;
  21.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  22.        
  23.         NVIC_InitStructure.NVIC_IRQChannel                                                 = USART3_IRQn;
  24.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority         = 0;
  25.         NVIC_InitStructure.NVIC_IRQChannelSubPriority                         = 0;
  26.         NVIC_InitStructure.NVIC_IRQChannelCmd                                         = ENABLE;
  27.         NVIC_Init(&NVIC_InitStructure);
  28.        
  29.         USART_InitStructure.USART_BaudRate                                 = 115200;
  30.         USART_InitStructure.USART_WordLength                         = USART_WordLength_8b;
  31.         USART_InitStructure.USART_StopBits                                 = USART_StopBits_1;
  32.         USART_InitStructure.USART_Parity                                 = USART_Parity_No;
  33.         USART_InitStructure.USART_HardwareFlowControl         = USART_HardwareFlowControl_None;
  34.         USART_InitStructure.USART_Mode                                         = USART_Mode_Tx|USART_Mode_Rx;
  35.         USART_Init(USART3,&USART_InitStructure);
  36.        
  37.         USART_ClearFlag(USART3,USART_IT_RXNE);        //清除中断标志
  38.         USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);        //设置中断方式
  39.         USART_Cmd(USART3,ENABLE);        //使能终端       
  40. }
复制代码
回复

使用道具 举报

10

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2014-4-12
在线时间
182 小时
发表于 2023-2-23 09:48:57 | 显示全部楼层
本帖最后由 ringhui 于 2023-2-23 09:54 编辑

你先用TTL转232把单片机的TX和RX连接到电脑上,看看有没有把数据收发,来判断你的单片机配置有没有问题,如果单片机配置没有问题那就485收发器的问题了。
自收发电路是配置485芯片周边电路实现的像 https://mp.weixin.qq.com/s/ghQsZ47yrJNsrVKa6jPPlg 里面介绍的那样来实现自收发功能,跟你程序配置没关系。
如果485芯片没有设计自收发电路,则需要你手动控制一个单片机管脚来实现收发功能,这就不是自收发了。
其他一些自收发电路参考 https://mp.weixin.qq.com/s/fcJuQehh6z_LfDWvlVFAyA
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 09:55:43 | 显示全部楼层
我直接使用串口是可以正常的收发的,但是换到485这边就不行了,发送和接收都没反应,硬件电路的话是有设置成自收发的,就像你发的链接里面的原理图一样的,但是我配置完就是发不出数据,不知道是哪里出了问题
回复

使用道具 举报

10

主题

74

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2014-4-12
在线时间
182 小时
发表于 2023-2-23 10:12:45 | 显示全部楼层
那你要考虑485芯片供电有3.3V和5V的有没有用错,三极管型号对不对这些硬件问题了
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 10:48:17 | 显示全部楼层
使用了串口3,硬件电路没问题,试验过了,但是软件配置请大家帮忙看下,是不是哪里错了,我直接使用USART_SendData,发送一个十六进制的数据,串口那边使用485转USB连接PC端上位机显示,但是上位机一点数据都没有,这是串口的配置 //        PB10 TX,PB11 RX ,USART3void usart_485_init(void)
{       
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //打开USART1的时钟
       
        /*USART3_TX -> PB10 , USART3_RX -> PB11 ,  PB10,低电平进入发送模式,高电平进入接收模式
        当TX高电平,mos管导通,RE和DE引脚接地,进入接收模式。当TX低电平,mos管截止,RE和DE引脚接高电平,进入发送模式
        TXD发1,AB就发1;TXD发0,AB就发0*/
        //usart_tx
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;       
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_11;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel                                                 = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority         = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                         = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                         = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        USART_InitStructure.USART_BaudRate                                 = 115200;
        USART_InitStructure.USART_WordLength                         = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits                                 = USART_StopBits_1;
        USART_InitStructure.USART_Parity                                 = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl         = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode                                         = USART_Mode_Tx|USART_Mode_Rx;
        USART_Init(USART3,&USART_InitStructure);
       
        USART_ClearFlag(USART3,USART_IT_RXNE);        //清除中断标志
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);        //设置中断方式
        USART_Cmd(USART3,ENABLE);        //使能终端       
}

这是原理图

这是原理图
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2023-1-11
在线时间
22 小时
 楼主| 发表于 2023-2-23 14:02:08 | 显示全部楼层
有人吗,急啊,RS482发不出数据的原因是什么啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 16:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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